如何有效地在java中实现这个scala操作

时间:2014-06-12 16:30:53

标签: java scala sorting arraylist

我使用List(1, 2, 3, 4) ::: List(1, 2, 5) distinct来解决这个问题。它返回List(1, 2, 3, 4, 5)

如何在java中实现相同的功能,并且非常高效和优雅地完成它?

3 个答案:

答案 0 :(得分:3)

使用SortedSet代替List以避免重复并进行排序。 使用

set.addAll (otherSet);

添加另一个Set

总而言之:

TreeSet<Integer> set = new TreeSet<>();
set.addAll (Arrays.asList (1,2,3,4));
set.addAll (Arrays.asList (1,2,5));

嗯,这是优雅的方式。由于你必须在这里使用int的包装类,它可能没有你想要的效率。

答案 1 :(得分:2)

几乎可以肯定,Scala在内部只是将此结构转换为一个集合,以便提供distinct行为。正如所建议的,使用TreeSetLinkedHashSet(后者,我怀疑,会更快),将正常工作。另一种选择,如果你对如何高效地感兴趣,那就是美妙的Guava library

List<Integer> distinctLs = new ImmutableSet.Builder<Integer>()
                               .addAll(listOne).addAll(listTwo)
                               .build().asList();

特别是,Guava的immutable collections能够进行许多内部优化。例如,他们的不可变哈希集合(ImmutableSetImmutableMap等)保留了插入顺序,.asList()调用返回O(1)中的视图,而不是需要构造一个整体O(n)中的新列表。


Guava还允许您使用ImmutableList.of(1,2,3,4)简洁地构建列表。

答案 2 :(得分:1)

Java 8也有功能(有点):

    IntStream stream1 = IntStream.builder().add(1).add(2).add(3).add(4).build();
    IntStream stream2 = IntStream.builder().add(1).add(2).add(5).build();
    IntStream concatStream = IntStream.concat(stream1, stream2).distinct();
    concatStream.forEach(x -> System.out.println(x));

我没有太多使用它;我找不到更简单的方法来创建IntStream。