vorrei definire il file come un campo (in aggiunta al filename
, e vi suggerisco di leggere che dalla cartella principale dell'utente) file
private File file = new File(System.getProperty("user.home"), filename);
Quindi è possibile utilizzare l'operatore diamante <>
quando si definisce il proprio List
. Puoi usare un try-with-resources
a close
il tuo Scanner
. Vuoi leggere per linee. E puoi split
il tuo line
. Quindi si verifica se la prima colonna corrisponde al nome. In tal caso, iterare le altre colonne sono analizzarle su int
. Qualcosa di simile
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;
}
Potrebbe essere signifanctly più efficiente per eseguire la scansione del file una volta e memorizzare i nomi ei campi come Map<String, List<Integer>>
come
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;
}
Poi memorizzare che, come fileContents
come
private Map<String, List<Integer>> fileContents = readFile(filename);
Quindi implementa il tuo metodo loadDataFor(String)
con fileContents
come
public List<Integer> loadDataFor(String name) throws IOException {
return fileContents.get(name);
}
Se il modello di utilizzo legge File
per molti nomi, è probabile che il secondo sia molto più veloce.
fonte
2015-06-07 04:47:35
Volete trasformare stringa a intero? – Alexander