使用Comparable/Comparator实现集合的自定义排序。

自定义List类型,Pair里面有两个int元素:first,Second。List简写为A={[1,2],[1,1],[8,5],[6,3]}。

如何对A中所有数据第一个数字进行排序,如果第一个数字相同用第二个数字排序?排序结果为A={[1,1],[1,2],[6,3],[8,5]}

使用Comparable接口,在需对比的实体类上实现该接口的 conparaTo方法

class Pair implements Comparable<Pair> {
    
    

    private int first;
    private int second;

    public Pair(int first, int second) {
    
    
        this.first = first;
        this.second = second;
    }

    @Override
    public int compareTo(Pair p) {
    
    
        if (first == p.first) {
    
    
            if (second == p.second) return 0;
            return second < p.second ? -1 : 1;
        }
        return first < p.first ? -1 : 1;
    }

    public int getSum() {
    
    
        return first + second;
    }

    public String toString() {
    
    
        return "[first:" + first + ", second:" + second + ", sum:" + getSum() + "]";
    }

   
}

使用Collections.sort(list);激活排序

    public static void main(String[] args) {
    
    
        ArrayList<Pair> list = new ArrayList<>();
        list.add(new Pair(8, 1));
        list.add(new Pair(6, 5));
        list.add(new Pair(6, 3));
        list.add(new Pair(5, 7));
        list.add(new Pair(4, 9));

        // 用Comparable排序 -- 先按第一个数排序  再按第二个数排序
        Collections.sort(list);
        for (Pair p: list){
    
    
            System.out.println(p);
    }
    }

为了保证的封装类型,使用外部Coparator进行排序

在外部时使用匿名内部类Comparator进行排序构造

 Collections.sort(list2, new Comparator<Pair2>() {
    
    
            @Override
            public int compare(Pair2 o2, Pair2 o1) {
    
    
                if (o2.getFirst()-o1.getSecond() ==0){
    
    
                    return o2.getSecond()-o1.getSecond();
                }
                 return o2.getFirst()-o1.getFirst();
            }
        });

Guess you like

Origin blog.csdn.net/qq_36737214/article/details/119605701