Question

That is, if I had two or more sets, and I wanted to return a new set containing either:

  1. All of the elements each set has in common (AND).
  2. All of the elements total of each set (OR).
  3. All of the elements unique to each set. (XOR).

Is there an easy, pre-existing way to do that?

Edit: That's the wrong terminology, isn't it?

Was it helpful?

Solution

Assuming 2 Set objects a and b

AND(intersection of two sets)

a.retainAll(b); 

OR(union of two sets)

a.addAll(b);

XOR either roll your own loop:

foreach item
if(a.contains(item) and !b.contains(item) ||  (!a.contains(item) and b.contains(item)))
 c.add(item)

or do this:

c.addAll(a); 
c.addAll(b);
a.retainAll(b); //a now has the intersection of a and b
c.removeAll(a); 

See the Set documentation and this page. For more.

OTHER TIPS

You can use the Google-Collections Sets class which has the methods intersection() union() and symmetricDifference().

Sets.intersection(set1, set2);
Sets.union(set1, set2);

SetView view = Sets.intersection(Sets.union(set1, set2), set3);
Set result = view.copyInto(new HashSet());

@Milhous said:

check out the sets api. if you use addAll you can get or. If you use retainAll you can get the and. I dont know about the Xor.

It seems like if you had sets s1 and s2 you could do this to get XOR:

  1. copy the set s1 to s3
  2. s1.removeAll(s2); (s1 now contains all elements not in s2)
  3. s2.removeAll(s3); (s2 now contains all elements not in s3 = the old s1)
  4. s1.addAll(s2); (s1 now contains the union of the above two sets)

check out the sets api. if you use addAll you can get or. If you use retainAll you can get the and. I dont know about the Xor.

Edit: from the set documentation.

...If the specified collection is also a set, the addAll operation effectively modifies this set so that its value is the union of the two sets.

....If the specified collection is also a set, this operation effectively modifies this set so that its value is the intersection of the two sets.

I'm pretty sure that Jakarta Common Collections API supports unions, intersections etc.

I'd be amazed if the Google Collections API didn't as well.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top