Как отсортировать один массив на основе другого, когда элементы повторяются, в Java? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть два ArrayLists

A: 5 3 2 6 1 4

B: 0 1 2 0 3 2

Я хочу отсортировать B на основе соответствующих значения из A, поэтому я должен получить: 3 2 1 2 0 0

Когда я использую следующие коды:

ArrayList<Integer> D=new ArrayList<Integer>(B);
Collections.sort(B, Comparator.comparing(s -> A.get(D.indexOf(s))));

или:

   ArrayList<Integer> D = new ArrayList<Integer>(B);
   Collections.sort(B, new Comparator<Integer>(){
        public int compare(Integer a,Integer b){
            return Integer.compare(A.get(D.indexOf(a)),A.get(D.indexOf(b)));
        }
   });

Это будет сработали, если элементы в B были уникальными, но так как 2 и 0 имеют 2 вхождения, каждый раз, когда вызывается A.get(D.indexOf(2)), возвращается 2 и никогда не возвращается.

Итак, я наконец получаю: 3 2 2 1 0 0

Может кто-нибудь помочь мне с компаратором, который занимается этим? Я не хочу делать полный алгоритм сортировки, но такие решения также приветствуются.

1 Ответ

2 голосов
/ 07 апреля 2020

Простой способ сделать это следующим образом:

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Integer> list1 = List.of(5, 3, 2, 6, 1, 4);
        List<Integer> list2 = List.of(0, 1, 2, 0, 3, 2);
        List<Integer> tempList = new ArrayList<>();
        for (Integer i : list1) {
            tempList.add(list2.get(i - 1));
        }
        System.out.println(tempList);
    }
}

Вывод:

[3, 2, 1, 2, 0, 0]

[Обновить]

Ниже приводится обновленное решение для удовлетворения нового требования ОП, упомянутого в комментарии под ответом.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

    public static void main(String[] args){
        List<Integer> list1 = List.of(15, 13, 12, 16, 11, 14);
        List<Integer> list2 = List.of(0, 1, 2, 0, 3, 2);
        List<Integer> tempList = new ArrayList<>();
        int max = Collections.max(list1);
        int offset = max - list2.size() + 1;
        for (Integer i : list1) {
            tempList.add(list2.get(i - offset));
        }
        System.out.println(tempList);
    }
}

Вывод:

[3, 2, 1, 2, 0, 0]
...