Вы можете создать метод c stati, возвращающий Comparator
, который поддерживается картой, например:
public static <T> Comparator<T> lookupComparator(Iterable<T> order) {
int index = 0;
final Map<T, Integer> orderMap = new HashMap<T, Integer>();
for (T t : order) {
orderMap.put(t, index++);
}
return new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
Objects.requireNonNull(o1);
Objects.requireNonNull(o2);
if (o1 == o2) {
return 0;
}
return orderMap.get(o1).compareTo(orderMap.get(o2));
}
};
}
@Test
public void testLookupComparator() {
Comparator<String> lc = lookupComparator(Arrays.asList("c", "a", "b", "z", "m", "g"));
List<String> someValues = Arrays.asList("a", "b", "c", "g", "m", "z");
someValues.sort(lc);
System.out.println(someValues);
}
Это напечатает [c, a, b, z, m, g]
. Однако это вызовет исключение, если любое значение равно null
или отсутствует на карте.