繁体   English   中英

当元素重复时,如何在 Java 中基于另一个数组对一个数组进行排序?

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

我有两个 ArrayList

答:5 3 2 6 1 4

乙:0 1 2 0 3 2

我想根据 A 中的相应值对 B 进行排序,所以我应该得到: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 而永远不会返回 4。

所以我终于得到: 3 2 2 1 0 0

谁能帮我处理一个比较器来处理这个问题? 我不想做一个完整的排序算法,但也欢迎这样的解决方案。

一个简单的方法如下:

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]

[更新]

下面给出了一个更新的解决方案,以满足答案下方评论中提到的 OP 的新要求。

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM