Метод сортировки по нескольким спискам (необходимы настройки) - PullRequest
0 голосов
/ 19 января 2020

У меня есть метод сортировки, который сортирует несколько списков на основе первого введенного списка.

private static <T extends Comparable<T>> void multiSort(
            final List<T> key, List<?>... lists) {

    List<Integer> indices = new ArrayList<>();
    for (int i = 0; i < key.size(); i++) {
        indices.add(i);
    }

    Collections.sort(indices, (i, j) -> key.get(i).compareTo(key.get(j)));

    Map<Integer, Integer> swapMap = new HashMap<>(indices.size());
    List<Integer> swapFrom = new ArrayList<>(indices.size()),
            swapTo = new ArrayList<>(indices.size());
    for (int i = 0; i < key.size(); i++) {
        int k = indices.get(i);
        while (i != k && swapMap.containsKey(k)) {
            k = swapMap.get(k);
        }

        swapFrom.add(i);
        swapTo.add(k);
        swapMap.put(i, k);
    }

    for (List<?> list : lists)
        for (int i = 0; i < list.size(); i++)
            Collections.swap(list, swapFrom.get(i), swapTo.get(i));
}

Пример: ПЕРЕД ИСПОЛЬЗОВАНИЕМ multiSort

List_1: 7, 3, 8, 2, 20 , 13, 15, 2, 10, 2

Список_2: 400, 216, 307, 50, 61, 111, 209, 77, 15, 36

...

ПОСЛЕ ИСПОЛЬЗОВАНИЯ multiSort

multiSort (List_1, List_1, List_2);

List_1: 2 , 2 , 2 , 3, 7, 8, 10, 13, 15, 20

Список_2: 50 , 77 , 36 , 216, 400 , 307, 15, 111, 209, 61

...

Задача

Что я хочу сделать, это отсортировать List_2 одинаково как первый, если первый список содержит те же значения (2, 2, 2, ...). Ожидаемый результат:

Список_1: 2 , 2 , 2 , 3, 7, 8, 10, 13, 15, 20

Список_2: 36 , 50 , 70 , 216, 400, 307, 15, 111, 209, 61

...