[英]java, how to read a .txt file that have multiple lines of different numbers of integers
我有一個.txt文件,每一行都是這樣的格式
1 2,10 3,20
2 6,87
。 。 。
該文件實際上代表一個圖形,第1行表示頂點1的邊指向頂點2,長度為10,頂點1也具有指向邊的頂點到頂點3,長度為20。第2行表示頂點2的頂點只有一個方向。邊到頂點6,長度為87。
我想做Dajkstra的最短路徑算法。 我不想定義頂點類,邊緣類等,相反,我想將每條線存儲到二維數組中,以便通過使用索引可以獲取圖形信息。 如果是在python中,我會將整個文件存儲到嵌套列表[[((2,10)(3,20)],[(6,87)],...]中,這樣就無需創建頂點,邊緣上課,我可以通過為列表建立索引來輕松訪問所有必要的圖形信息。
我的問題是,如何用Java做到這一點? 2-D數組不好,因為每行可能具有不同數量的整數。 ArrayList可能不錯,但是如何有效地將整個txt文件讀入此類arraylist?
ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();
try{
Scanner sc = new Scanner(new File("a.txt"));
while(sc.hasNextLine()){
String line= sc.nextLine();
ArrayList<Integer> vertex = new ArrayList<Integer>();
Scanner lineContents = new Scanner(line).useDelimiter("\\D"); //"\\D" means any none digit
while (lineContents.hasNext()) {
vertex.add(lineContents.nextInt());
}
graph.add(vertex);
lineContents.close();
}
sc.close();
}
試試這個方法:
public Map<Integer, Map<Integer, Integer>> process(String filePath) throws IOException {
Map<Integer, Map<Integer, Integer>> graph = new HashMap<>();
Files.lines(new File(filePath).toPath())
.map(line -> line.split(" "))
.map(Arrays::asList)
.forEachOrdered(elements -> {
int vertexId = parseInt(elements.get(0));
Map<Integer, Integer> vertexMap = new HashMap<>();
elements.subList(1, elements.size()).stream()
.map(element -> element.split(","))
.map(Arrays::asList)
.forEach(pair -> vertexMap.put(parseInt(pair.get(0)), parseInt(pair.get(1))));
graph.put(vertexId, vertexMap);
});
return graph;
}
我返回了一個Map
而不是List
因為按索引工作是一種不好的做法,並且您獲得了相同的功能。
另請注意,這未經測試-可能無法正常工作,但我認為可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.