Ich würde die Datei als Feld definieren (zusätzlich zu den filename
, und ich schlage vor, es aus Anwender Home-Ordner zu lesen) file
private File file = new File(System.getProperty("user.home"), filename);
Dann können Sie den Diamant-Operator <>
verwenden, wenn Sie Ihre List
definieren. Sie können eine try-with-resources
zu close
Ihre Scanner
verwenden. Sie möchten nach Zeilen lesen. Und Sie können split
Ihre line
. Dann testen Sie, ob Ihre erste Spalte mit dem Namen übereinstimmt. Wenn dies der Fall ist, wiederholen Sie die anderen Spalten, um sie zu int
zu analysieren. So etwas wie
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;
}
Es könnte signifanctly effizienter sein, die Datei einmal zu scannen und speichern Sie die Namen und Felder als Map<String, List<Integer>>
wie
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;
}
Dann speichern, dass als fileContents
wie
private Map<String, List<Integer>> fileContents = readFile(filename);
Und dann implementieren Sie Ihre loadDataFor(String)
Methode mit fileContents
wie
Wenn Ihr Verwendungsmuster die File
für viele Namen liest, ist die zweite wahrscheinlich viel schneller.
Sie wollen String drehen integer zu? – Alexander