有 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的最快方法是什么


共 (1) 个答案

  1. # 1 楼答案

    我知道streams和regex通常比较慢,但有更紧凑和可读性更好的优势。因此,即使我的答案没有回答您关于时间方面最佳性能的问题,如果您只有一行要读,并且您的方法没有被频繁连续调用,那么可能也值得考虑:

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