Reputation: 21
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
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