Я бы определил файл в качестве поля (в дополнение к filename
, и я предлагаю прочитать его из домашней папки пользователя) file
private File file = new File(System.getProperty("user.home"), filename);
Затем вы можете использовать оператора алмаза <>
, когда вы определяете свой List
. Вы можете использовать try-with-resources
до close
Scanner
. Вы хотите читать строки. И вы можете split
ваш line
. Затем вы проверяете, совпадает ли ваш первый столбец с именем. Если да, то итерация остальных столбцов анализирует их на int
. Что-то вроде
public List<Integer> loadDataFor(String name) throws IOException {
List<Integer> data = new ArrayList<>();
try (Scanner s = new Scanner(file)) {
while (s.hasNextLine()) {
String[] row = s.nextLine().split("\\s+");
if (row[0].equalsIgnoreCase(name)) {
for (int i = 1; i < row.length; i++) {
data.add(Integer.parseInt(row[i]));
}
}
}
}
return data;
}
Это может быть signifanctly более эффективно сканировать файл один раз и сохранить имена и поля как Map<String, List<Integer>>
как
public static Map<String, List<Integer>> readFile(String filename) {
Map<String, List<Integer>> map = new HashMap<>();
File file = new File(System.getProperty("user.home"), filename);
try (Scanner s = new Scanner(file)) {
while (s.hasNextLine()) {
String[] row = s.nextLine().split("\\s+");
List<Integer> al = new ArrayList<>();
for (int i = 1; i < row.length; i++) {
al.add(Integer.parseInt(row[i]));
}
map.put(row[0], al);
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
Затем сохранить, что в fileContents
как
private Map<String, List<Integer>> fileContents = readFile(filename);
А затем реализуйте свой метод loadDataFor(String)
с fileContents
как
public List<Integer> loadDataFor(String name) throws IOException {
return fileContents.get(name);
}
Если ваш шаблон использования читает File
для многих имен, то второй, вероятно, будет намного быстрее.
Вы хотите превратить строку в целое число? – Alexander