public static Map<Comparable, Grp> groupBy(Collection<Doc> docs, String field) { Map<Comparable, Grp> groups = new HashMap<Comparable, Grp>(); for (Doc doc : docs) { List<Comparable> vals = doc.getValues(field); if (vals == null) { Grp grp = groups.get(null); if (grp == null) { grp = new Grp(); grp.groupValue = null; grp.docs = new ArrayList<Doc>(); groups.put(null, grp); } grp.docs.add(doc); } else { for (Comparable val : vals) { Grp grp = groups.get(val); if (grp == null) { grp = new Grp(); grp.groupValue = val; grp.docs = new ArrayList<Doc>(); groups.put(grp.groupValue, grp); } grp.docs.add(doc); } } } return groups; }