繁体   English   中英

如何使用java从列表中删除重复项和匹配的原始元素

[英]How to remove duplicates and matching original elements from list using java

我已经尝试使用 Set Collection 来删除重复项,但这并不能解决我在这里问的问题。

我正在尝试完成以下任务:我有一个列表Integer [] list1 = {1,2,3,3}; 我想删除重复项,但我也想删除匹配对,所以我想要的结果是{1,2}

我会使用频率图来过滤频率大于 2 的元素。

  • 频率图freqMap有条目: {1=1, 2=1, 3=2} ,我们只需要过滤值大于 2 的条目.filter(e -> e.getValue()<2)其中这里是{3=2}
  • 现在我们有条目: {1=1, 2=1}但我们只想要键{1, 2}所以我们使用map()函数来获取键: .map(e -> e.getKey())

尝试这个:

Map<Integer, Long> freqMap = Arrays.stream(list1)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

int[] result = freqMap.entrySet().stream()
        .filter(e -> e.getValue() < 2).map(e -> e.getKey()).mapToInt(m -> m).toArray();

System.out.println(Arrays.toString(result));

输出:

[1, 2]

您可以使用地图。 计算元素在 <int, int> 映射中出现的次数,并仅获取计数为 1 的键。

那么这就是你的例子,

{

  1: 1,
  2: 1,
  3: 2,

}

然后只需提取键 1 和 2,因为它们的计数为 1。O(n) 时间和空间。

我的第一个想法是从列表中获取一个集合,然后删除该集合中列表中的所有元素,并删除该集合中剩余列表中的所有元素。

    Integer[] arr = { 1, 2, 3, 3 };
    List<Integer> list = new ArrayList<>(Arrays.asList(arr));
    Set<Integer> set = new HashSet<>(list);
    for (Iterator<Integer> iterator = set.iterator(); iterator.hasNext();) {
        list.remove(iterator.next());
    }
    set.removeAll(list);
    System.out.println(list);
    System.out.println(set);

输出:

[3]
[1, 2]

这将适用于小于 Java 8 的 Java 版本。否则只需使用 freqMap() 由 Hülya 回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM