1

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.

1
  • 1
    This is impossible to do with a comparator, simply because what you are trying to do here, is not sorting. Commented Apr 7, 2020 at 10:16

1 Answer 1

2

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]
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for the reply, though I think this looks like an answer specific to only this question, but I wanted an answer that suits a wide range of test cases. List A could be: 15,13,12,16,11,14; in which case we will not get this answer.
@somuchsonal - I've posted an update to meet this requirement. Feel free to comment in case of any issue/doubt.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.