somuchsonal
somuchsonal

Reputation: 21

How to sort one array based on another, when elements repeat, in Java?

I have two ArrayLists

A: 5 3 2 6 1 4

B: 0 1 2 0 3 2

I want to sort B, based on corresponding values from A, so I should get : 3 2 1 2 0 0

When I use the following codes :

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

or :

   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)));
        }
   });

It would have worked if the elements in B were unique, but since both 2 and 0 has 2 occurances, every time A.get(D.indexOf(2)) is called, 2 is returned and 4 is never returned.

So I finally get : 3 2 2 1 0 0

Can anyone help me with a comparator that deals with this? I don't want to make a full sorting algorithm, but such solutions are also welcome.

Upvotes: 1

Views: 54

Answers (1)

Arvind Kumar Avinash
Arvind Kumar Avinash

Reputation: 79500

A simple way to do it as follows:

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);
    }
}

Output:

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

[Update]

Given below is an updated solution to meet OP's new requirement mentioned in the comment below the answer.

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);
    }
}

Output:

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

Upvotes: 2

Related Questions