122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver/*
222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * Copyright 2012, Google Inc.
322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * All rights reserved.
422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver *
522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * Redistribution and use in source and binary forms, with or without
622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * modification, are permitted provided that the following conditions are
722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * met:
822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver *
922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver *     * Redistributions of source code must retain the above copyright
1022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * notice, this list of conditions and the following disclaimer.
1122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver *     * Redistributions in binary form must reproduce the above
1222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * copyright notice, this list of conditions and the following disclaimer
1322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * in the documentation and/or other materials provided with the
1422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * distribution.
1522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver *     * Neither the name of Google Inc. nor the names of its
1622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * contributors may be used to endorse or promote products derived from
1722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * this software without specific prior written permission.
1822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver *
1922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver */
3122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
3222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverpackage org.jf.util;
3322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
344ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruverimport com.google.common.base.Predicate;
3522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport com.google.common.collect.ImmutableSortedSet;
3622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport com.google.common.collect.Ordering;
3722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport com.google.common.primitives.Ints;
3822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
3922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport javax.annotation.Nonnull;
404ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruverimport java.util.*;
4122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
4222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverpublic class CollectionUtils {
434ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    public static <T> int listHashCode(@Nonnull Iterable<T> iterable) {
444ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        int hashCode = 1;
454ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        for (T item: iterable) {
464ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            hashCode = hashCode*31 + item.hashCode();
474ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        }
484ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        return hashCode;
494ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    }
504ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver
514ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    public static <T> int lastIndexOf(@Nonnull Iterable<T> iterable, @Nonnull Predicate<? super T> predicate) {
524ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        int index = 0;
534ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        int lastMatchingIndex = -1;
544ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        for (T item: iterable) {
554ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            if (predicate.apply(item)) {
564ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver                lastMatchingIndex = index;
574ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            }
584ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            index++;
594ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        }
604ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        return lastMatchingIndex;
614ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    }
624ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver
6322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    public static <T extends Comparable<? super T>> int compareAsList(@Nonnull Collection<? extends T> list1,
6422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                                                                      @Nonnull Collection<? extends T> list2) {
6522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        int res = Ints.compare(list1.size(), list2.size());
6622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        if (res != 0) return res;
6722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        Iterator<? extends T> elements2 = list2.iterator();
6822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        for (T element1: list1) {
6922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            res = element1.compareTo(elements2.next());
7022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            if (res != 0) return res;
7122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        }
7222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return 0;
7322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    }
7422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
754ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    public static <T> int compareAsIterable(@Nonnull Comparator<? super T> comparator,
764ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver                                            @Nonnull Iterable<? extends T> it1,
774ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver                                            @Nonnull Iterable<? extends T> it2) {
784ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        Iterator<? extends T> elements2 = it2.iterator();
794ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        for (T element1: it1) {
807d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            T element2;
817d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            try {
827d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver                element2 = elements2.next();
837d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            } catch (NoSuchElementException ex) {
847d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver                return 1;
857d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            }
867d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            int res = comparator.compare(element1, element2);
874ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            if (res != 0) return res;
884ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        }
897d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver        if (elements2.hasNext()) {
907d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            return -1;
917d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver        }
924ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        return 0;
934ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    }
944ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver
954ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    public static <T extends Comparable<? super T>> int compareAsIterable(@Nonnull Iterable<? extends T> it1,
964ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver                                                                          @Nonnull Iterable<? extends T> it2) {
974ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        Iterator<? extends T> elements2 = it2.iterator();
984ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        for (T element1: it1) {
997d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            T element2;
1007d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            try {
1017d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver                element2 = elements2.next();
1027d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            } catch (NoSuchElementException ex) {
1037d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver                return 1;
1047d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            }
1057d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            int res = element1.compareTo(element2);
1064ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            if (res != 0) return res;
1074ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        }
1087d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver        if (elements2.hasNext()) {
1097d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver            return -1;
1107d5439950fe52a7be4fa6cb222e301f78604f96fBen Gruver        }
1114ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        return 0;
1124ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    }
1134ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver
11422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    public static <T> int compareAsList(@Nonnull Comparator<? super T> elementComparator,
11522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                                        @Nonnull Collection<? extends T> list1,
11622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                                        @Nonnull Collection<? extends T> list2) {
11722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        int res = Ints.compare(list1.size(), list2.size());
11822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        if (res != 0) return res;
11922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        Iterator<? extends T> elements2 = list2.iterator();
12022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        for (T element1: list1) {
12122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            res = elementComparator.compare(element1, elements2.next());
12222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            if (res != 0) return res;
12322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        }
12422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return 0;
12522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    }
12622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
1274ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    @Nonnull
12822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    public static <T> Comparator<Collection<? extends T>> listComparator(
12922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            @Nonnull final Comparator<? super T> elementComparator) {
13022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return new Comparator<Collection<? extends T>>() {
13122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            @Override
13222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            public int compare(Collection<? extends T> list1, Collection<? extends T> list2) {
13322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                return compareAsList(elementComparator, list1, list2);
13422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            }
13522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        };
13622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    }
13722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
1384ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    public static <T> boolean isNaturalSortedSet(@Nonnull Iterable<? extends T> it) {
1394ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        if (it instanceof SortedSet) {
1404ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            SortedSet<? extends T> sortedSet = (SortedSet<? extends T>)it;
14122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            Comparator<?> comparator = sortedSet.comparator();
1424ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            return (comparator == null) || comparator.equals(Ordering.natural());
1434ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        }
1444ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        return false;
1454ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    }
1464ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver
1474ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    public static <T> boolean isSortedSet(@Nonnull Comparator<? extends T> elementComparator,
1484ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver                                          @Nonnull Iterable<? extends T> it) {
1494ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        if (it instanceof SortedSet) {
1504ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            SortedSet<? extends T> sortedSet = (SortedSet<? extends T>)it;
1514ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            Comparator<?> comparator = sortedSet.comparator();
1524ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            if (comparator == null) {
1534ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver                return elementComparator.equals(Ordering.natural());
15422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            }
1554ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            return elementComparator.equals(comparator);
1564ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        }
1574ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        return false;
1584ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    }
1594ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver
1604ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    @Nonnull
1614ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    private static <T> SortedSet<? extends T> toNaturalSortedSet(@Nonnull Collection<? extends T> collection) {
1624ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        if (isNaturalSortedSet(collection)) {
1634ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            return (SortedSet<? extends T>)collection;
16422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        }
16522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return ImmutableSortedSet.copyOf(collection);
16622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    }
16722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
16822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull
16922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    private static <T> SortedSet<? extends T> toSortedSet(@Nonnull Comparator<? super T> elementComparator,
17022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                                                          @Nonnull Collection<? extends T> collection) {
17122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        if (collection instanceof SortedSet) {
17222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            SortedSet<? extends T> sortedSet = (SortedSet<? extends T>)collection;
17322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            Comparator<?> comparator = sortedSet.comparator();
17422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            if (comparator != null && comparator.equals(elementComparator)) {
17522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                return sortedSet;
17622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            }
17722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        }
17822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return ImmutableSortedSet.copyOf(elementComparator, collection);
17922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    }
18022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
1814ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    @Nonnull
1824ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    public static <T> Comparator<Collection<? extends T>> setComparator(
1834ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            @Nonnull final Comparator<? super T> elementComparator) {
1844ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        return new Comparator<Collection<? extends T>>() {
1854ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            @Override
1864ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            public int compare(Collection<? extends T> list1, Collection<? extends T> list2) {
1874ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver                return compareAsSet(elementComparator, list1, list2);
1884ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver            }
1894ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver        };
1904ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver    }
1914ffbfa2e71ffdf6ecaa8429b19ce29daa28e9fc4Ben Gruver
19222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    public static <T extends Comparable<T>> int compareAsSet(@Nonnull Collection<? extends T> set1,
19322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                                                             @Nonnull Collection<? extends T> set2) {
19422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        int res = Ints.compare(set1.size(), set2.size());
19522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        if (res != 0) return res;
19622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
19722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        SortedSet<? extends T> sortedSet1 = toNaturalSortedSet(set1);
19822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        SortedSet<? extends T> sortedSet2 = toNaturalSortedSet(set2);
19922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
20022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        Iterator<? extends T> elements2 = set2.iterator();
20122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        for (T element1: set1) {
20222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            res = element1.compareTo(elements2.next());
20322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            if (res != 0) return res;
20422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        }
20522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return 0;
20622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    }
20722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
20822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    public static <T> int compareAsSet(@Nonnull Comparator<? super T> elementComparator,
20922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                                       @Nonnull Collection<? extends T> list1,
21022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                                       @Nonnull Collection<? extends T> list2) {
21122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        int res = Ints.compare(list1.size(), list2.size());
21222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        if (res != 0) return res;
21322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
21422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        SortedSet<? extends T> set1 = toSortedSet(elementComparator, list1);
21522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        SortedSet<? extends T> set2 = toSortedSet(elementComparator, list2);
21622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
21722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        Iterator<? extends T> elements2 = set2.iterator();
21822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        for (T element1: set1) {
21922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            res = elementComparator.compare(element1, elements2.next());
22022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            if (res != 0) return res;
22122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        }
22222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return 0;
22322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    }
22422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver}
225