Notas de estudio de JAVA - Clases comunes (4) - Comparador de Java (Comparable y Comparator)

1. Descripción: Los objetos en Java, en circunstancias normales, solo se pueden comparar: == o !=. No se puede usar > o <.

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

En segundo lugar, el uso de la interfaz comparable: clasificación natural

1. Al igual que String, clases contenedoras, etc. implemente la interfaz Comparable, reescriba el método compareTo() y proporcione una forma de comparar dos objetos
2. Después de reescribir el método compareTo() como String, clases contenedoras, realice de pequeño a Arreglo grande
(en particular, además de implementar el método compareTo() reescrito por la interfaz Comparable, la clase contenedora
también tiene un método compare(x, y) definido por la propia clase contenedora)

3. Reescriba la regla de compareTo(obj ):
Si el objeto actual es mayor que El parámetro formal objeto obj devuelve un entero positivo,
si el objeto actual es menor que el parámetro formal objeto obj, devuelve un entero negativo, y
si el objeto actual es igual al formal objeto de parámetro obj, devuelve cero.
4. Para las clases personalizadas, si se requiere ordenar, podemos hacer que la clase personalizada implemente la interfaz Comparable, anule el método compareTo() y
especifique en el método 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. Uso de la interfaz Comparator: clasificación personalizada
1. Antecedentes:
cuando el tipo de elemento no implementa la interfaz java.Lang.Comparable y no es conveniente modificar el código
o la regla de clasificación que implementa la interfaz java.Lang.Comparable no es adecuado para la operación actual.
Entonces puede considerar usar objetos Comparator para ordenar
2. Vuelva a escribir el método compare(0bobject o1, object o2) para comparar el tamaño de o1 y o2:
si el método devuelve un número entero positivo, significa que o1 es mayor que o2;
si devuelve e, significa igual;
devuelve un entero negativo, que indica que o1 es menor que 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));
    }
}

Supongo que te gusta

Origin blog.csdn.net/m0_46450708/article/details/119617735
Recomendado
Clasificación