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

时间:2016-05-29 09:41:24

标签: java arrays hashset

如何知道已删除的HashSet?

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

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

我如何知道从xset消除了哪些元素?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

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

  1. 查找数组中的重复项,可以将这些重复项视为从HashSet中删除的值。但这并不需要对HashSet做任何事情。
  2. 示例:

    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类并覆盖add(Object obj)方法,以便当对象已存在于HashSet中时,它将被添加到已删除项目的列表中。当然,这意味着您必须在HashSet的任何地方使用此自定义HashSet
    2. 示例:

      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;
       }
      }
      

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