Есть ли простой способ преобразовать упорядоченный список в таблицу поиска? - PullRequest
1 голос
/ 06 мая 2020

Если я создаю список, используя Arrays.asList(), список гарантированно будет размещен в порядке вставки. Я хочу использовать это как способ легко определить порядок сортировки для компаратора в верхней части моего класса:

List<String> sortedKeyOrder = Arrays.asList("x", "y", "z");

Есть ли простой способ преобразовать порядок вставки этого списка в константу таблица поиска времени для компаратора?

1 Ответ

1 голос
/ 06 мая 2020

Вы можете создать метод 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 или отсутствует на карте.

...