首页 > 解决方案 > 我可以用 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 的最快方法是什么?

标签: javaperformanceio

解决方案


我知道流和正则表达式通常速度较慢,但​​具有更紧凑和可读的优势。因此,即使我的回答没有回答您关于时间方面最佳性能的问题,如果您只有一行要阅读并且您的方法不经常被连续调用,则可能值得考虑:

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())));
}

推荐阅读