tôi sẽ xác định các tập tin như một lĩnh vực (ngoài các filename
, và tôi khuyên bạn nên đọc nó từ thư mục nhà của người dùng) file
private File file = new File(System.getProperty("user.home"), filename);
Sau đó, bạn có thể sử dụng toán tử kim cương <>
khi bạn xác định List
. Bạn có thể sử dụng try-with-resources
đến close
Scanner
của mình. Bạn muốn đọc theo dòng. Và bạn có thể split
line
của mình. Sau đó, bạn kiểm tra xem cột đầu tiên của bạn có khớp với tên không. Nếu có, lặp lại các cột khác sẽ phân tích cú pháp chúng thành int
. Một cái gì đó như
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;
}
Nó có thể là signifanctly hiệu quả hơn để quét các tập tin một lần và lưu trữ các tên và các lĩnh vực như một Map<String, List<Integer>>
như
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;
}
Sau đó lưu trữ mà như fileContents
như
private Map<String, List<Integer>> fileContents = readFile(filename);
Và sau đó triển khai phương pháp loadDataFor(String)
của bạn với fileContents
như
public List<Integer> loadDataFor(String name) throws IOException {
return fileContents.get(name);
}
Nếu mẫu sử dụng của bạn đọc File
đối với nhiều tên thì thứ hai có thể sẽ nhanh hơn nhiều.
Nguồn
2015-06-07 04:47:35
Bạn muốn biến String để số nguyên? – Alexander