import java.util.*; public class SetConsolidation { public static void main(String[] args) { List> h1 = hashSetList("AB", "CD"); System.out.println(consolidate(h1)); List> h2 = hashSetList("AB", "BD"); System.out.println(consolidateR(h2)); List> h3 = hashSetList("AB", "CD", "DB"); System.out.println(consolidate(h3)); List> h4 = hashSetList("HIK", "AB", "CD", "DB", "FGH"); System.out.println(consolidateR(h4)); } // iterative private static List> consolidate(Collection> sets) { List> r = new ArrayList<>(); for (Set s : sets) { List> new_r = new ArrayList<>(); new_r.add(s); for (Set x : r) { if (!Collections.disjoint(s, x)) { s.addAll(x); } else { new_r.add(x); } } r = new_r; } return r; } // recursive private static List> consolidateR(List> sets) { if (sets.size() < 2) return sets; List> r = new ArrayList<>(); r.add(sets.get(0)); for (Set x : consolidateR(sets.subList(1, sets.size()))) { if (!Collections.disjoint(r.get(0), x)) { r.get(0).addAll(x); } else { r.add(x); } } return r; } private static List> hashSetList(String... set) { List> r = new ArrayList<>(); for (int i = 0; i < set.length; i++) { r.add(new HashSet()); for (int j = 0; j < set[i].length(); j++) r.get(i).add(set[i].charAt(j)); } return r; } }