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