我有一种排序方法,可以根据第一个输入的列表对多个列表进行排序。
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之前
列表_1:7、3、8、2、20、13、15、2、10、2
列表_2:400、216、307、50、61、111、209、77、15、36
...
使用多排序后
multiSort(List_1,List_1,List_2);
列表_1: 2 , 2 , 2 ,3、7、8、10、13、15、20
列表_2: 50 , 77 , 36 ,216、400、307、15、111、209、61
...
问题
我想要做的是,如果第一个列表包含相同的值(2、2、2 ...),则对List_2的排序方式与第一个列表相同。 预期结果:
列表_1: 2 , 2 , 2 ,3、7、8、10、13、15、20
列表_2: 36 , 50 , 70 ,216、400、307、15、111、209、61