【问题标题】:get the duplicates values from Arraylist<String> and then get those items in another Arraylist从 Arraylist<String> 获取重复值,然后在另一个 Arraylist 中获取这些项目
【发布时间】:2019-01-02 13:26:12
【问题描述】:

我有一个数组列表,其中包含一些重复的值我想将这些值收集到另一个数组列表中...... 喜欢

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

在这里,我想在另一个数组列表中获取所有重复值...

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

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

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

【问题讨论】:

  • 请解释您在输入和所需输出方面的问题。
  • 为什么要列出重复项?毕竟,重复的元素都是相等的,String 类型的元素没有多大意义...你需要所有的重复项,还是只需要重复的那些(即除了第一次出现之外的所有重复项)?此外,您并没有告诉我们何时认为 2 个元素相等。是通过equals 方法还是通过其他一些标准?请澄清这个问题,并添加示例输入和预期输出。
  • 共享一个通用实用程序来求解值 n,即元素出现的次数。做take a look at it,希望对你有帮助。

标签: java android arraylist collections


【解决方案1】:

您可以为此使用一组:

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 的值,并将其收集到结果列表中

【讨论】:

  • 感谢您的回答,但请您阅读更新后的问题,并对最后一个不完整的问题感到抱歉.....
  • 这给了我一些错误,例如 Lambada 表达式、方法引用、静态接口方法调用在这些行中的语言 1.7 中不受支持 (e -> e.getValue() >= 3.... ..Map.Entry::getKey.....Function.identity()) 也需要最低 Api 级别 24
  • 这意味着你有java 7。在这个版本中不支持lambdas
  • 实际上我有 java 8 但 android studio 支持 java 7 现在我将编译器设置为 1.8 谢谢但这个答案不适合我,因为它需要最低 android 版本的牛轧糖
【解决方案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));

【讨论】:

  • 我更喜欢one .stream() .distinct() .filter(i-&gt;Collections.frequency(one, i)&gt;1) .collect(Collectors.toCollection(ArrayList::new));
  • @Eritrean 对流的每个元素使用Collections.frequency 会使解决方案的复杂性变为O(n^2),这是非常不可取的。
  • 请阅读更新后的问题,对最后一个问题表示抱歉。新手实施起来太复杂了,你能给我另一个答案或解释一下吗……谢谢你的贡献
猜你喜欢
  • 2014-05-23
  • 2016-08-23
  • 1970-01-01
  • 2016-05-15
  • 2014-06-08
  • 2013-10-05
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多