我有一个包含以下字符串的 ArrayList
;
List<String> e = new ArrayList<String>();
e.add("123");
e.add("122");
e.add("125");
e.add("123");
我想检查列表中的重复项并将其从列表中删除。 在这种情况下,我的列表只有两个值,在此示例中它将是值122和125,而两个123将会消失。最好的方法是什么?我考虑使用一个Set,但那只会删除其中一个重复项。使用Guava库,可以使用Multiset和Streams:
e = HashMultiset.create(e).entrySet().stream()
.filter(me -> me.getCount() > 1)
.map(me -> me.getElement())
.collect(toList());
这个方法对于大型列表来说相当漂亮,速度也相当快(O(n),常数因子相当大)。但它不保留顺序(如果需要保留顺序,可以使用LinkedHashMultiset
),并且它会创建一个新的列表实例。
此外,它也很容易推广,例如可以删除所有三元组。
总的来说,多重集数据结构真的很有用,值得放在工具箱里。
Set
不会移除项目,它将防止添加重复的项目。 - Thomas Weller