1 25 38 package org.jgrapht.experimental.equivalence; 39 40 import java.util.*; 41 42 43 54 public class EquivalenceSetCreator<E, C> 55 { 56 57 59 private static final EqGroupSizeComparator groupSizeComparator = 60 new EqGroupSizeComparator(); 61 62 64 75 @Deprecated public static <EE, CC> EquivalenceSet [] 76 createEqualityGroupOrderedArray( 77 EE [] aElementsArray, 78 EquivalenceComparator<? super EE, ? super CC> aEqComparator, 79 CC aContext) 80 { 81 return 82 (createEqualityGroupOrderedArray( 83 Arrays.asList(aElementsArray), 84 aEqComparator, 85 aContext)); 86 } 114 115 123 public static <EE, CC> EquivalenceSet [] createEqualityGroupOrderedArray( 124 Collection<EE> elements, 125 EquivalenceComparator<? super EE, ? super CC> aEqComparator, 126 CC aContext) 127 { 128 ArrayList<EquivalenceSet<? super EE, ? super CC>> arrayList = 129 new ArrayList<EquivalenceSet<? super EE, ? super CC>>(); 130 131 HashMap<Integer , List<EquivalenceSet<? super EE, ? super CC>>> map = 132 createEqualityGroupMap(elements, aEqComparator, aContext); 133 139 for (List<EquivalenceSet<? super EE, ? super CC>> list : map.values()) { 140 for (EquivalenceSet<? super EE, ? super CC> eSet : list) { 141 arrayList.add(eSet); 142 } 143 } 144 145 EquivalenceSet [] resultArray = new EquivalenceSet [arrayList.size()]; 148 arrayList.toArray(resultArray); 149 Arrays.sort(resultArray, groupSizeComparator); 150 return resultArray; 151 } 152 153 166 private static <EE, CC> HashMap<Integer , List<EquivalenceSet<? super EE, ? super CC>>> 167 createEqualityGroupMap( 168 Collection<EE> elements, 169 EquivalenceComparator<? super EE, ? super CC> aEqComparator, 170 CC aComparatorContext) 171 { 172 HashMap<Integer , List<EquivalenceSet<? super EE, ? super CC>>> equalityGroupMap = 173 new HashMap<Integer , List<EquivalenceSet<? super EE, ? super CC>>>( 174 elements.size()); 175 176 for (EE curentElement : elements) { 177 int hashcode = 178 aEqComparator.equivalenceHashcode( 179 curentElement, 180 aComparatorContext); 181 List<EquivalenceSet<? super EE, ? super CC>> list = 182 equalityGroupMap.get(Integer.valueOf(hashcode)); 183 184 187 if (list == null) { 188 list = new LinkedList<EquivalenceSet<? super EE, ? super CC>>(); 190 list.add( 191 new EquivalenceSet<EE, CC>( 192 curentElement, 193 aEqComparator, 194 aComparatorContext)); 195 196 equalityGroupMap.put(Integer.valueOf(hashcode), list); 198 } else { 199 boolean eqWasFound = false; 200 201 for (EquivalenceSet<? super EE, ? super CC> eqGroup : list) { 204 if ( 205 eqGroup.equivalentTo( 206 curentElement, 207 aComparatorContext)) { 208 eqGroup.add(curentElement); 210 eqWasFound = true; 211 break; 212 } 213 } 214 215 if (!eqWasFound) { 217 list.add( 218 new EquivalenceSet<EE, CC>( 219 curentElement, 220 aEqComparator, 221 aComparatorContext)); 222 } 223 } 224 } 225 226 return equalityGroupMap; 227 } 228 229 231 240 private static class EqGroupSizeComparator 241 implements Comparator<EquivalenceSet> 242 { 243 248 @SuppressWarnings ("unchecked") 249 public int compare(EquivalenceSet arg1, EquivalenceSet arg2) 250 { 251 int eqGroupSize1 = arg1.size(); 252 int eqGroupSize2 = arg2.size(); 253 if (eqGroupSize1 > eqGroupSize2) { 254 return 1; 255 } else if (eqGroupSize1 < eqGroupSize2) { 256 return -1; 257 } else { int eqGroupHash1 = arg1.hashCode(); 259 int eqGroupHash2 = arg2.hashCode(); 260 if (eqGroupHash1 > eqGroupHash2) { 261 return 1; 262 } else if (eqGroupHash1 < eqGroupHash2) { 263 return -1; 264 } else { 265 return 0; 266 } 267 } 268 } 269 } 270 } 271 | Popular Tags |