我使用List(1, 2, 3, 4) ::: List(1, 2, 5) distinct
来解决这个问题。它返回List(1, 2, 3, 4, 5)
。
如何在java中实现相同的功能,并且非常高效和优雅地完成它?
答案 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
行为。正如所建议的,使用TreeSet
或LinkedHashSet
(后者,我怀疑,会更快),将正常工作。另一种选择,如果你对如何高效地写感兴趣,那就是美妙的Guava library。
List<Integer> distinctLs = new ImmutableSet.Builder<Integer>()
.addAll(listOne).addAll(listTwo)
.build().asList();
特别是,Guava的immutable collections能够进行许多内部优化。例如,他们的不可变哈希集合(ImmutableSet
,ImmutableMap
等)保留了插入顺序,.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。