java - 我可以用 Java 读取和处理这一行文件的最快方法是什么?
问题描述
我有以下代码:
static HashMap<Integer, ArrayList<Integer>> parseInput(String filename) throws IOException {
String[] edges = new String[0];
BufferedReader br = new BufferedReader(new FileReader(filename));
String line;
while ((line = br.readLine()) != null) {
edges = line.split(",");
}
br.close();
edges[0] = edges[0].replace("[", "");
edges[edges.length - 1] = edges[edges.length - 1].replace("]", "");
HashMap<Integer, ArrayList<Integer>> adj = new HashMap<>();
int i = 0;
while(i < edges.length) {
Integer l = Integer.parseInt(edges[i].replace("(", ""));
Integer r = Integer.parseInt(edges[i + 1].replace(")", ""));
if(adj.get(l) == null) {
adj.put(l, new ArrayList<Integer>());
adj.get(l).add(r);
}
else {
adj.get(l).add(r);
}
i += 2;
}
return adj;
}
它读取一个类似于以下内容的文本文件:[(0,1),(0,2),(1,2),(1,3),(1,4),(2,3),(3,5),(4,5)]
它表示图中的边列表。它只有一条线。程序读取列表并将边添加到表示邻接列表的 HashMap 中。
读取该文件并将边缘提取到 HashMap 的最快方法是什么?
解决方案
我知道流和正则表达式通常速度较慢,但具有更紧凑和可读的优势。因此,即使我的回答没有回答您关于时间方面最佳性能的问题,如果您只有一行要阅读并且您的方法不经常被连续调用,则可能值得考虑:
static Map<Integer, List<Integer>> parseInput(String filename) throws IOException {
Path path = Paths.get(filename);
String line = Files.readAllLines(path).get(0);
return Pattern.compile("\\d+,\\d+")
.matcher(line)
.results()
.map(MatchResult::group)
.map(i -> new AbstractMap.SimpleEntry<>(
Integer.parseInt(i.split(",")[0]),
Integer.parseInt(i.split(",")[1])))
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
}
推荐阅读
- c - 取消引用时,转换为 char 指针的 void 指针崩溃
- c - linux内核中具有相同签名的函数
- javascript - 有没有办法将 Googles AutoML 与 JavaScript 一起使用?
- python - 如何创建一个使按钮每次单击时向下移动的功能?
- javascript - Vue中如何访问子组件数据
- mysql - 如何计算每行的 2 个时间戳之间的总差异
- python - 在 2 个数据帧的每一行中查找常用词(交集)
- c# - 二维旋转矩形包含点计算
- rpm-spec - Linux rpm 将包重定位到多个前缀
- c++ - GPU cuda 代码是否可以在多个 GPU 卡上工作而无需任何实现?