5

HashSet在多个Integers我想获得所有这些元素,它们没有重复。即在所有的联合中只出现过一次HashSet。我无法以编程方式对其进行概念化。

例如,假设第一个集合包含 {2,4,6,8,9},第二个集合包含 {2,8,9},第三个集合包含 {2,4,8,9}。在所有这些集合中,元素 6 仅出现一次。

如何在Java的多个整数HashSet中找到所有不重复的元素?

4

7 回答 7

4

您可以保存至少出现一次和至少两次的元素集。这有点手动循环,但它是可能的。这将适用于任意数量的差异集,并且不会修改输入:

public static Set<E> unique(Set<? extends E>... sets){
   Set<E> once = new HashSet<E>();
   Set<E> twice = new HashSet<E>();

   for(Set<? extends E> set:sets){
      for(E el:set){
         if(once.contains(el)){
            twice.add(el);
         } else {
            once.add(el);
         }
      }
   }

   once.removeAll(twice);
   return once;
} 

ideone:http: //ideone.com/reGDBy

示例用法:

Set<Integer> set1, set2, set3;
...
Set<Integer> u = unique(set1, set2, set3);

评估示例:

例如,假设第一个集合包含 {2,4,6,8,9},第二个集合包含 {2,8,9},第三个集合包含 {2,4,8,9}。在所有这些集合中,元素 6 仅出现一次。

  • 第一个内循环完成后,once包含 {2,4,6,8,9} 并且twice为空。
  • 添加第二个集合:2、8 和 9 已经在once集合中,因此它们被添加到twice集合中。
  • once现在是 {2,4,6,8,9},twice现在是 {2,8,9}。
  • 从第三组开始: 2 被重新添加到twice, 4 被添加到twice, 8 , 9 被重新添加到twice
  • once现在是 {2,4,6,8,9}(所有集合的并集),twice现在是 {2,4,8,9}(至少出现两次的元素)。
  • 从. twice_ 现在是 {6}。返回。onceonceonce
于 2012-12-08T14:33:14.137 回答
1

您可以使用该contains()方法来做到这一点。首先,从所有其他集合中创建一个新的 HashSet。然后遍历这个集合并检查是否有其他集合contains()指定的元素。如果两个或更多列表包含它,那么您有一个重复的并且可以continue。例如,如果只有一个集合包含该元素,您可以将其存储在不同结​​果集中的某个位置。

我写了一个实用方法来实现你所需要的:

public static <E> HashSet<E> uniques(HashSet<E>... sets){
    HashSet<E> everything = new HashSet<E>();
    for(HashSet<E> set : sets){
        everything.addAll(set);
    }
    HashSet<E> uniques = new HashSet<E>();
    for(E e : everything){
        int count = 0;
        for(HashSet<E> set : sets){
            if(set.contains(e)){
                count++;
            }
            if(count > 1){
                break;
            }
        }
        if(count == 1){
            uniques.add(e);
        }

    }
    return uniques;
}
于 2012-12-08T14:36:30.740 回答
1

使用中间Multiset番石榴版本:

@SafeVarargs
public static <E> Set<E> uniqueElements(Set<? extends E>... sets) {
    final Multiset<E> multiset = HashMultiset.create();
    for (Set<? extends E> set : sets) {
        multiset.addAll(set);
    }
    return Sets.filter(multiset.elementSet(), new Predicate<E>() {
        @Override
        public boolean apply(E element) {
            return multiset.count(element) == 1;
        }
    });
}
于 2012-12-08T16:28:11.240 回答
0

创建一个多重集并遍历它,取出计数为 1 的所有元素 O(n)

于 2012-12-08T14:33:54.767 回答
0
 public static void main(String[] args) {
        HashSet<Integer> set1 = new HashSet<Integer>();

        set1.add(2);
        set1.add(4);
        set1.add(6);
        set1.add(8);
        set1.add(9);
        HashSet<Integer> set2 = new HashSet<Integer>();
        set2.add(2);
        set2.add(8);
        set2.add(9);
        HashSet<Integer> set3 = new HashSet<Integer>();
        set3.add(2);
        set3.add(4);
        set3.add(8);
        set3.add(9);
        set1.removeAll(set2);
        set1.removeAll(set3);
        System.out.println(set1);
    }
于 2012-12-08T14:34:01.127 回答
0

如何创建 2 个新的 Hashset。称为 seenOnce 和 seenMoreThenOnce。

然后迭代不同哈希图中的所有整数。

For each integer:
   If it is in seenMoreThenOnce do nothing.
   else If it is in seenOnce, remove it from seenOnce and add it to seenMoreThenOnce
   Else add it to seenOnce.

当您完成对所有哈希图的迭代时,seenOnce 将包含只看到一次的整数。

于 2012-12-08T14:35:23.460 回答
-1
public class test {

public static void main(String[] args) throws Exception, IOException {

    int count=0;
    HashSet<Integer> set1 = new HashSet<Integer>();
    HashMap<Integer, String> ee=new HashMap<Integer,String>();
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("how many elements u want to store");
    int n=Integer.parseInt(br.readLine());
    System.out.println("enter te element u want insert");
    for(int i=0;i<n;i++)
    {
        boolean x=set1.add(Integer.parseInt(br.readLine()));
        if(x==false)
        {
            count++;
        }
    }
    System.out.println("no of duplicate elements is   "+count);
    }
}
于 2013-09-15T16:21:00.577 回答