将两个ArrayList并行合并到一个ArrayList?

时间:2019-12-30 22:44:34

标签: java multithreading arraylist parallel-processing

我需要将两个ArrayList合并到一个ArrayList中,但我需要非常快地完成它,因为执行此操作的函数被称为多次。这是我的函数版本:

  public ArrayList<Pair<String, Integer>> mergeIdWithGrade(ArrayList<String> id, ArrayList<Integer> grades) {

    ArrayList<Pair<String, Integer>> list = new ArrayList<>();
    for(int i = 0; i< id.size(); i++)
    {
        list.add(new Pair<String,Integer>(id.get(i), grades.get(i)));
    }
    return list;
}

两个作为函数参数的ArrayList,它们的大小相同,并且i的索引ArrayList<String> id处的元素对应于i的索引ArrayList<Integer> grades处的元素(他们正在结对)。 该函数的复杂性显然是O(n),但是我想知道是否可以使用parallelStreams来完成此操作,或者通常使用CPU的所有内核并行进行此操作?

2 个答案:

答案 0 :(得分:0)

这里的多线程是一个坏主意,因为您不能确定原始列表的状态。 确保它是线程安全的。

答案 1 :(得分:0)

我同意其他评论,即并行执行可能无济于事。 不过,尝试一下这段代码,看看并行对您是否有好处

    public List<Pair<String, Integer>> mergeIdWithGrade(List<String> id, List<Integer> grades) {
      return IntStream
            .range(0, Math.min(id.size(), grades.size()))
            .parallel() // try with and without it
            .mapToObj(i -> new Pair(id.get(i), grades.get(i)))
            .collect(Collectors.toList());
    }

注意,这里仅映射是在不同线程中完成的。结果将由主线程收集。