Найти целые числа и строки для каждой строки и поместить их в массив?

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

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

Вот что имеет файл dat:

75242; Уппсала

90325; Умео

96133; Боден

23642; Höllviken

35243; Векшё

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 Хёлльвикен

35243 Växjö

51000 Йёнчёпинг

72211 Вестерос

75242 Упсала

90325 Умео

96133 Боден

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

4 ответа

Решение

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

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, Теперь 0-й индекс будет содержать число, а 1-й индекс будет содержать строку.

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

Вы можете использовать функцию split и разделить ее, используя ";" как файл.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
  }

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

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 но это довольно просто.

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

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
Другие вопросы по тегам