2016-05-29 58 views
0

如何知道什么已被消除HashSet?Java - 如何知道已经被淘汰的HashSet?

我有一个数组int [] x = {2, 4, 4, 5};

当我隐蔽它,HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(x));

我怎么知道哪些元素已经从x排除到set

+0

没有办法说第一个或第二个'4'被淘汰,因为它们是平等的。 –

+0

没有老兄,在这种情况下,我只想“4”@PeterLawrey –

+0

在这种情况下,你应该检查你添加他们看Jon Skeet的答案。注意:如果有三个4例如,你可以得到重复,重复。 –

回答

5

而不是使用该构造方法,你可以使用:

Set<Integer> set = new HashSet<>(); 
for (int value : x) { 
    if (!set.add(value)) { 
     // Or whatever you want to do 
     System.out.println("Detected a duplicate... " + value); 
    } 
} 
+0

好吧,所以'set.add'返回布尔值? –

+0

是的,如果成功则返回'true',否则返回'false'。 –

+3

@TilakMadichetti:你看过要检查的文档,并理解返回值吗? (堆栈溢出是*不是*自己阅读文档的替代品。) –

1

除了什么乔恩斯基特提到的,如果你正在寻找的东西通用的,那么这里有我的可能的方法:

  1. 查找数组中的重复项,以及那些可以被视为从HashSet中移除的值。尽管如此,这并不需要对HashSet做任何事情。

实施例:

Arrays.sort(myArray); 
for (int i = 1; i < myArray.length; ++i) { 
    if (0 == myComparator.compare(myArray[i - 1], myArray[i])) { 
    // Found a duplicate. Store/print it 
    } 
} 
  • 扩展HashSet类并覆盖add(Object obj)方法,使得当对象在HashSet中已经存在它被添加到列表已删除的项目。当然,这意味着你将不得不使用这个定制HashSet无论你想使用HashSet
  • 例子:

    public MyHashSet extends HashSet<E> { 
    List<E> removedAsDuplicateItems = new ArrayList<>(); 
    
    @Override 
    public boolean add(E e) { 
        boolean isNewItem = map.put(e, PRESENT)==null; 
        if(!isNewItem) removedAsDuplicateItems.add(e); 
        return isNewItek; 
    } 
    
    public List<E> removedAsDuplicateItems() { 
        return removedAsDuplicateItems; 
    } 
    } 
    

    我希望有更多的,我不知道的优雅和简洁的解决方案。