从Arraylist <string>获取重复值,然后在另一个Arraylist中获取那些项

时间:2019-01-02 13:26:13

标签: java android arraylist collections

我有一个arraylist,其中包含一些重复的值,我想将这些值收集到另一个Arraylist中。 喜欢

 Arraylist<String> one;   //contains all values with duplicates
  one.add("1");
  one.add("2");
  one.add("2");
  one.add("2");

在这里,我想在另一个arraylist中获取所有重复值...

Arraylist<String> duplicates;    //contains all duplicates values which is 2.

我想要那些大于或等于3的值。

当前,我对此没有任何解决方案,请帮助我找出答案

2 个答案:

答案 0 :(得分:6)

您可以为此使用一套:

Set<String> set = new HashSet<>();
List<String> duplicates = new ArrayList<>();

for(String s: one) {
    if (!set.add(s)) {
        duplicates.add(s);
    }
}

您只需将所有元素添加到集合中。如果方法add()返回false,则表示该元素未添加到集合中,即该元素已经存在。

输入:[1, 3, 1, 3, 7, 6]

重复项:[1, 3]

已编辑

对于等于或大于3的值,您可以像这样使用流:

List<String> collect = one.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
            .entrySet()
            .stream()
            .filter(e -> e.getValue() >= 3)
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());

基本上,您是在地图中收集初始列表的,其中key是字符串,value是计数。然后,您可以过滤此地图以获取计数值大于3的值,并将其收集到结果列表中

答案 1 :(得分:2)

您也可以通过信息流执行此操作:

List<String> duplicates = one.stream()
                .collect(Collectors.groupingBy(Function.identity(), counting()))
                .entrySet()
                .stream()
                .filter(e -> e.getValue() > 1)
                .map(Map.Entry::getKey)
                .collect(Collectors.toCollection(ArrayList::new));