JAVA学習ノート - 共通クラス (4) - Java Comparator (ComparableとComparator)

1. 説明: Java のオブジェクトは、通常の状況では == または != のみ比較できます。>または<は使用できません。

    但是在开发场景中,我们需要对多个对象进行排序,
    言外之意,就需要比较对象的大小如何实现?﹖使用两个接口中的任何一个: Comparable 或 comparator

2 番目に、Comparable インターフェイスの使用: 自然な並べ替え

1. String と同様に、ラッパー クラスなどは Comparable インターフェイスを実装し、compareTo() メソッドを書き換えて、2 つのオブジェクトを比較する方法を提供します。
2. String やラッパー クラスと同様に、compareTo() メソッドを書き換えた後、小さいものから大きな配置
(特に、Comparable インターフェースによって書き換えられた CompareTo() メソッドの実装に加えて、ラッパー クラスには
ラッパー クラス自体によって定義された Compare(x, y) メソッドもあります)

3. CompareTo(obj) のルールを書き換えます。 ):
現在のオブジェクト this が仮パラメータ オブジェクト obj より大きい場合は正の整数を返し、
現在のオブジェクト this が仮パラメータ オブジェクト obj より小さい場合は負の整数を返し、
現在のオブジェクト this が仮パラメータ オブジェクト obj に等しい場合は負の整数を返します。パラメータ オブジェクト obj はゼロを返します。
4. カスタム クラスの場合、並べ替えが必要な場合は、カスタム クラスに Comparable インターフェイスを実装させ、compareTo() メソッドをオーバーライドして、
compareTo(obj) メソッドで指定できます。

public class Goods implements Comparable{
    
    
    private String name;
    private double price;

    public Goods() {
    
    
    }

    public Goods(String name, double price) {
    
    
        this.name = name;
        this.price = price;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public double getPrice() {
    
    
        return price;
    }

    public void setPrice(double price) {
    
    
        this.price = price;
    }

    @Override
    public String toString() {
    
    
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    //指明商品比较大小的方式:按照价格从低到高,再按照name从低到高
    @Override
    public int compareTo(Object o) {
    
    
        if (o instanceof Goods){
    
    
            Goods goods = (Goods) o;
            if (this.price>goods.price){
    
    
                return 1;
            }else if (this.price<goods.price){
    
    
                return -1;
            }else {
    
    
//                return 0;
                return this.name.compareTo(goods.name);
            }
        }
        throw new RuntimeException("输入的数据有误");
    }
}

3. Comparator インターフェイスの使用: カスタム並べ替え
1. 背景:要素タイプが java.Lang.Comparable インターフェイスを実装しておらず、コードまたは java.Lang.comparable インターフェイスを実装する並べ替えルール
を変更するのが不便な場合
は現在の操作には適していません。
その後、Comparator オブジェクトを使用して 2 を並べ替えることを検討できます。o1
と o2 のサイズを比較するように、compare(0bobject o1, object o2) メソッドを書き換えます。
メソッドが正の整数を返す場合、それは次のことを意味します。 o1 は o2 より大きい;
e が返される場合は、等しいことを意味する;
戻り値 o1 が o2 より小さいことを示す負の整数。

public class CompareTest {
    
    
    /*
自然排序 自定义的Goods类实现了Comparable接口,重写了comparTo()
    */
    @Test
    public void test_1(){
    
    
        Goods[] goods = new Goods[6];
        goods[0]= new Goods("lenovoMouse", 34);
        goods[1]= new Goods("dellMouse", 43);
        goods[2]=new Goods("microsoftMouse",65);
        goods[3]= new Goods("xiaomiMouse", 12);
        goods[4]= new Goods("huaweiMouse", 226);
        goods[5]= new Goods("huaweiMouse", 65);

        Arrays.sort(goods);
        System.out.println(Arrays.toString(goods));
    }
    /*
    Comparator接口的使用:定制排序
    1.背景:
    当元素的类型没有实现java.Lang. Comparable接口朋又不方便修改代码,
    或者实现了java.Lang.comparable接口的排序规则不适合当前的操作,
    那么可以考虑使用Comparator 的对象来排序
    2.重写compare(Object o1,object o2)方法,比较o1和o2的大小:
    如果方法返回正整数,则表示o1大于o2 ;
    如果返回e,表示相等;
    返回负整数,表示o1小于o2。
    */
    @Test
    public void test2(){
    
    
        String[] arr = new String[]{
    
    "AA", "CC", "KK", "MM" , "GG" ,"JJ" , "DD"};
        //从大到小,默认是从小到大
        Arrays.sort(arr, new Comparator<String>() {
    
    
            @Override
            public int compare(String o1, String o2) {
    
    
                return -o1.compareTo(o2);
            }
        });
        System.out.println(Arrays.toString(arr));
    }
    @Test
    public void test3(){
    
    
        Goods[] goods = new Goods[6];
        goods[0]= new Goods("lenovoMouse", 34);
        goods[1]= new Goods("dellMouse", 43);
        goods[2]=new Goods("microsoftMouse",65);
        goods[3]= new Goods("xiaomiMouse", 12);
        goods[4]= new Goods("huaweiMouse", 226);
        goods[5]= new Goods("huaweiMouse", 65);

        Arrays.sort(goods, new Comparator<Goods>() {
    
    
            //指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序
            @Override
            public int compare(Goods o1, Goods o2) {
    
    
                if (o1.getName().equals(o2.getName())) {
    
    
                    return -Double.compare(o1.getPrice(),o2.getPrice());
                }else {
    
    
                    return o1.getName().compareTo(o2.getName());
                }
            }
        });
        System.out.println(Arrays.toString(goods));
    }
}

おすすめ

転載: blog.csdn.net/m0_46450708/article/details/119617735
おすすめ