【问题标题】:how to get unique items from the Arraylist, preserving the natural order如何从 Arraylist 中获取唯一项,保持自然顺序
【发布时间】:2017-10-27 19:01:33
【问题描述】:

例如数组列表:

 Integer[] intArray = new Integer[] { 0, 1 , 0 , 2 , 3 , 3 , 5 , 6 , -4 ,6 };
 ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(intArray));

需要获取非重复值,保持顺序

1 , 2 , 5 , -4

0、3 和 6 被删除,因为它们不止一次出现。

【问题讨论】:

  • 请显示一些代码。你试过什么? (“自然顺序”是计数的顺序(在这种情况下)。-4 应该排在第一位。我假设您的意思是列表中给出的顺序。)
  • @JBNizet 因为不止一次出现。
  • 啊,好的。请在您的问题中澄清这一点。
  • @markspace 首先我想要一个哈希图,如果添加了元素(它是唯一的),那么将它添加到新列表中。但表达式不采用布尔表达式
  • 这不是 How do I remove repeated elements from ArrayList? 的副本。那里的答案留下了重复的元素,但只出现了一次。这个问题是问如何找到恰好出现一次的元素。

标签: java arraylist


【解决方案1】:

将元素放入LinkedHashSet;如果你找到一个已经存在的元素,把它放到另一个集合中;删除最后所有“已经存在”的元素:

LinkedHashSet<Integer> set = new LinkedHashSet<>();
HashSet<Integer> alreadyPresent = new HashSet<>();
for (Integer i : intArray) {
  if (!set.add(i)) {
    alreadyPresent.add(i);
  }
}
set.removeAll(alreadyPresent);

ArrayList<Integer> list = new ArrayList<>(set);

Ideone demo

【讨论】:

  • 正是需要的,谢谢!
【解决方案2】:

其他解决方案:构建所有数字的直方图(即每个数字出现的次数),只保留出现次数为1的数字。

使用流:

List<Integer> result =
        list.stream()
            .collect(Collectors.toMap(Function.identity(), i -> 1, Integer::sum, LinkedHashMap::new))
            .entrySet()
            .stream()
            .filter(e -> e.getValue() == 1)
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2015-07-08
    • 2013-07-10
    • 2020-10-13
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多