Java - 如何知道HashSet淘汰了什么?

Java -How to know what has been eliminated HashSet?

如何知道HashSet淘汰了什么?

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

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

我如何知道哪些元素已从 x 中删除到 set 中?

您可以使用:

而不是使用该构造函数
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);
    }
}

除了 Jon Skeet 提到的之外,如果您正在寻找通用的东西,那么这里是我可能的方法:

  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
  }
}
  1. 扩展 HashSet class 并重写 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;
 }
}

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