Найти целые числа и строки для каждой строки и поместить их в массив? - PullRequest
0 голосов
/ 17 января 2019

Итак, у меня есть этот файл данных (текстовый файл), который имеет одно государство и один почтовый индекс каждой страны. В этом файле данных у меня есть точка с запятой, которая разделяет строки для каждой строки и целые числа для каждой строки. Я также использую интерфейс и основной класс для этого, но этот класс должен выполнять большую часть работы. И внизу метод.

PS: Я пытался найти другие вопросы на этом сайте, которые уже отвечают на мои вопросы, но ни один из них на самом деле не помог!

Вот что имеет файл данных:

75242; Уппсала

90325; Умео

96133; Боден

23642; Höllviken

35243; Växjö

51000; Йончёпинг

72211; Вестерос

Моя проблема в том, что я не могу найти способ сохранить целые числа или строки в массивах так, как я хочу, чтобы они работали. Пытался читать только целые числа и только строки, но это не сработало. Также обратите внимание, что я попытался прочитать каждую строку, а затем каждый символ в файле данных, чтобы попытаться поместить значения в свои собственные массивы. Также пытался сдвинуть их, используя if'ments и говоря «if (Character.is ..)». В методе ниже я только пытаюсь захватить целые числа.

Также думал, что из-за точки с запятой я должен использовать что-то вроде «Character.is ....», чтобы проверить это, а затем перейти от чтения ch / string к int. Но хочу сделать один шаг за раз, иначе я ничего не сделаю!

public void read() {

    try {
        ArrayList<Integer> itemArr = new ArrayList<Integer>();
        ArrayList<String> descArr = new ArrayList<String>();
        FileReader file = new FileReader("C:\\Users\\me\\Desktop\\places.dat");
        BufferedReader r = new BufferedReader(file);
        int r1;

        while ((r.readLine()) != null) {
            while ((r1 = r.read()) != -1) {
                char ch = (char) r1;
                if (Character.isDigit(ch)) {
                    itemArr.add(r.read());
                }
            }
        }

    } catch (IOException e) {

    }
}

Это то, что ожидается: Они также отсортированы, но я могу справиться с этим, пока я не могу понять, как правильно хранить их в каждом из своих собственных массивов.

23642 Höllviken

35243 Växjö

51000 Йёнчёпинг

72211 Västerås

75242 Упсала

90325 Умео

96133 Боден

Спасибо за все комментарии, действительно помогает.

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Использование двух списков излишне. Если вы знаете, что каждый почтовый индекс связан с каждой страной, вы должны создать объекты для их хранения, , а затем поместить эти объекты в список.

public class MyLocation {
    private int zipcode;
    private String country;
    public MyLocation(int zipcode, String country) {
        this.zipcode = zipcode;
        this.country = country;
    }
    public int getZipcode() {
        return zipcode;
    }
    public String getCountry() {
        return country;
    }
}

Кроме того, у вас есть набор данных с разделителями, поэтому вы должны воспользоваться этим! Используйте String.split() и разделите эту точку с запятой, чтобы получить массив с обоими элементами, готовыми к извлечению.

ArrayList<MyLocation> locations = new ArrayList<>();
try {
    FileReader file = new FileReader("C:\\Users\\me\\Desktop\\places.dat");
    Bufferedreader r = new BufferedReader(file);
    try {
        String line;
        String[] lineValues;

        while ((line = r.readLine()) != null) {
            lineValues = line.split(";");
            MyLocation location = new MyLocation(Integer.valueOf(lineValues[0]), lineValues[1]);
            locations.add(location);
        } 
    } finally {
        r.close();
    }
} catch (IOException e) {
    e.printStackTrace();
}

Кроме того, неплохо бы закрыть ресурс, когда вы закончите с ним. Я отредактировал свой код, чтобы продемонстрировать один из способов сделать это.

Как уже упоминали другие, если вы хотите сортировать, вам нужно также реализовать Comparable, но это довольно просто.

0 голосов
/ 17 января 2019

Вы можете использовать функцию разделения и разделить ее, используя «;» как файл .dat имеет; между почтовым индексом и строкой. Если вы хотите, чтобы почтовый индекс был целым числом, вы можете проанализировать части [0], как показано ниже, чтобы дать вам представление /

 FileReader file = new FileReader("C:\\Users\\me\\Desktop\\places.dat");
 BufferedReader r = new BufferedReader(file);

  String st;
  while ((st = br.readLine()) != null) {
   String[] parts = st.split[";"] 
   parts[0] // will have zipcode
   parts[1] // will have other part
  }
0 голосов
/ 17 января 2019

Я предлагаю вам создать новый класс, например, где хранить номер и имя:

class NumberName {
    Integer number;
    String name;

    // constructor, setter, getter
}

Затем при чтении из файла вы помещаете их в список:

FileReader file = new FileReader("C:\\Users\\me\\Desktop\\places.dat");
BufferedReader r = new BufferedReader(file);
String line;

List<NumberName> list = new ArrayList<>();
while ((line = r.readLine()) != null) {
    String[] split = line.split(";");
    list.add(new NumberName(Integer.parseInt(split[0]), split[1]));
}

Тогда сортировка становится легкой:

list.sort(Comparator.comparingInt(NumberName::getNumber)); // by number
list.sort(Comparator.comparing(NumberName::getName)); // by name
list.sort(Comparator.comparing(NumberName::getNumber).thenComparing(NumberName::getName)); // by number then by name
0 голосов
/ 17 января 2019

Вы можете изменить свою логику следующим образом:

String currLine;
while ((currLine = r.readLine()) != null) {
    if (currLine.trim().length() > 0) {
        String[] split = currLine.split(";");
        itemArr.add(Integer.parseInt(split[0]));
        descArr.add(split[1]);
    }
}

Здесь мы разбиваем каждую строку ( currLine ) на основе ; и сохраняем ее в массиве split. Теперь индекс 0th будет содержать число, а индекс 1st будет содержать строку.

Чтобы добавить его в itemArr, вам нужно проанализировать его в int. Также обратите внимание, что если строка пуста, она пропускается. Сортировать это тоже довольно просто.

...