Java tutorial
//package com.java2s; import java.util.Collection; import java.util.Iterator; public class Main { /** * Used for results of getContainmentRelation */ public static final int ALL_EMPTY = 0, NOT_A_SUPERSET_B = 1, NOT_A_DISJOINT_B = 2, NOT_A_SUBSET_B = 4, NOT_A_EQUALS_B = NOT_A_SUBSET_B | NOT_A_SUPERSET_B, A_PROPER_SUBSET_OF_B = NOT_A_DISJOINT_B | NOT_A_SUPERSET_B, A_PROPER_SUPERSET_B = NOT_A_SUBSET_B | NOT_A_DISJOINT_B, A_PROPER_OVERLAPS_B = NOT_A_SUBSET_B | NOT_A_DISJOINT_B | NOT_A_SUPERSET_B; /** * Assesses all the possible containment relations between collections A and B with one call.<br> * Returns an int with bits set, according to a "Venn Diagram" view of A vs B.<br> * NOT_A_SUPERSET_B: a - b != {}<br> * NOT_A_DISJOINT_B: a * b != {} // * is intersects<br> * NOT_A_SUBSET_B: b - a != {}<br> * Thus the bits can be used to get the following relations:<br> * for A_SUPERSET_B, use (x & CollectionUtilities.NOT_A_SUPERSET_B) == 0<br> * for A_SUBSET_B, use (x & CollectionUtilities.NOT_A_SUBSET_B) == 0<br> * for A_EQUALS_B, use (x & CollectionUtilities.NOT_A_EQUALS_B) == 0<br> * for A_DISJOINT_B, use (x & CollectionUtilities.NOT_A_DISJOINT_B) == 0<br> * for A_OVERLAPS_B, use (x & CollectionUtilities.NOT_A_DISJOINT_B) != 0<br> */ public static int getContainmentRelation(Collection a, Collection b) { if (a.size() == 0) { return (b.size() == 0) ? ALL_EMPTY : NOT_A_SUPERSET_B; } else if (b.size() == 0) { return NOT_A_SUBSET_B; } int result = 0; // WARNING: one might think that the following can be short-circuited, by looking at // the sizes of a and b. However, this would fail in general, where a different comparator is being // used in the two collections. Unfortunately, there is no failsafe way to test for that. for (Iterator it = a.iterator(); result != 6 && it.hasNext();) { result |= (b.contains(it.next())) ? NOT_A_DISJOINT_B : NOT_A_SUBSET_B; } for (Iterator it = b.iterator(); (result & 3) != 3 && it.hasNext();) { result |= (a.contains(it.next())) ? NOT_A_DISJOINT_B : NOT_A_SUPERSET_B; } return result; } /** * Get the size of an iterator (number of items in it). * @param source * @return */ public static int size(Iterator source) { int result = 0; while (source.hasNext()) { source.next(); ++result; } return result; } }