Java tutorial
//package com.java2s; import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Ordering; import com.google.common.primitives.Ints; import javax.annotation.Nonnull; import java.util.*; public class Main { @Nonnull public static <T> Comparator<Collection<? extends T>> setComparator( @Nonnull final Comparator<? super T> elementComparator) { return new Comparator<Collection<? extends T>>() { @Override public int compare(Collection<? extends T> list1, Collection<? extends T> list2) { return compareAsSet(elementComparator, list1, list2); } }; } public static <T extends Comparable<T>> int compareAsSet(@Nonnull Collection<? extends T> set1, @Nonnull Collection<? extends T> set2) { int res = Ints.compare(set1.size(), set2.size()); if (res != 0) return res; SortedSet<? extends T> sortedSet1 = toNaturalSortedSet(set1); SortedSet<? extends T> sortedSet2 = toNaturalSortedSet(set2); Iterator<? extends T> elements2 = set2.iterator(); for (T element1 : set1) { res = element1.compareTo(elements2.next()); if (res != 0) return res; } return 0; } public static <T> int compareAsSet(@Nonnull Comparator<? super T> elementComparator, @Nonnull Collection<? extends T> list1, @Nonnull Collection<? extends T> list2) { int res = Ints.compare(list1.size(), list2.size()); if (res != 0) return res; SortedSet<? extends T> set1 = toSortedSet(elementComparator, list1); SortedSet<? extends T> set2 = toSortedSet(elementComparator, list2); Iterator<? extends T> elements2 = set2.iterator(); for (T element1 : set1) { res = elementComparator.compare(element1, elements2.next()); if (res != 0) return res; } return 0; } @Nonnull private static <T> SortedSet<? extends T> toNaturalSortedSet(@Nonnull Collection<? extends T> collection) { if (isNaturalSortedSet(collection)) { return (SortedSet<? extends T>) collection; } return ImmutableSortedSet.copyOf(collection); } @Nonnull private static <T> SortedSet<? extends T> toSortedSet(@Nonnull Comparator<? super T> elementComparator, @Nonnull Collection<? extends T> collection) { if (collection instanceof SortedSet) { SortedSet<? extends T> sortedSet = (SortedSet<? extends T>) collection; Comparator<?> comparator = sortedSet.comparator(); if (comparator != null && comparator.equals(elementComparator)) { return sortedSet; } } return ImmutableSortedSet.copyOf(elementComparator, collection); } public static <T> boolean isNaturalSortedSet(@Nonnull Iterable<? extends T> it) { if (it instanceof SortedSet) { SortedSet<? extends T> sortedSet = (SortedSet<? extends T>) it; Comparator<?> comparator = sortedSet.comparator(); return (comparator == null) || comparator.equals(Ordering.natural()); } return false; } }