Найти целые числа и строки для каждой строки и поместить их в массив?
Так что у меня есть этот файл данных (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