我如何在一个 class 中编写多个 "compareTo" 方法?

How could I write multiple "compareTo" methods in just one class?

我正在按两个对象比较和排序多个属性,但为此我创建了不同的 classes 来比较这些不同的属性。

这是我的主要class:

Collections.sort(Comparator, new SortByRef());
        System.out.println("\nOrdenado por Referencia");
        for(int i=0; i<Comparator.size(); i++)
            System.out.println(Comparator.get(i));


        Collections.sort(Comparator, new SortByMonto());
        System.out.println("\nOrdenado por Monto");
        for(int i=0; i<Comparator.size(); i++)
            System.out.println(Comparator.get(i));

        Collections.sort(Comparator, new SortByDes());
        System.out.println("\nOrdenado por Descripcion");
        for(int i=0; i<Comparator.size(); i++)
            System.out.println(Comparator.get(i));

        Collections.sort(Comparator, new SortByNP());
        System.out.println("\nOrdenado por Numero de parte");
        for(int i=0; i<Comparator.size(); i++)
            System.out.println(Comparator.get(i));

如您所见,在 Collections.sort 中,我创建了不同的 SortBy...,我的意思是,每个 class 都不同。

但我只想创建一个 class 来比较所有属性。我该怎么做?

例如,这些是我创建的方法:

public int compare(COSTOS ref1, COSTOS ref2) {
        return ref1.referencia - ref2.referencia;}

public int compare(COSTOS monto1, COSTOS monto2) {
        return (int) (monto1.monto - monto2.monto);
    }

我认为,您不想为每个排序顺序单​​独制作 class。但它不会像您尝试的那样工作。我认为,Comparator 是一个类型为 List 的变量。也许你应该尝试这样的事情:

comparator.sort(comparing(c -> c.referencia));
System.out.println("\nOrdenado por Referencia");
comparator.forEach(System.out::println);

这里的方法"comparing"是从JavaClass库的类型比较器中静态导入的。这使您成为一个新的比较器,而不需要新的命名顶层 class.

您的变量名(此处:比较器)应以小写字母开头。这是 Java.

中的通用约定

无需创建多个实现 Comparator 接口的 classes,您可以只创建多个进行比较的方法。然后,方法本身基本上 (!) Comparator 的实现,您可以使用方法引用将它传递给 Collections#sort 方法。

根据实际进行比较的方式,更简洁的形式是使用 Comparator#comparing methods, as 。具体来说,您可以在示例中使用 comparingInt。此处显示了两种方法:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MultipleCompareMethods
{
    public static void main(String[] args)
    {
        List<Costos> list = new ArrayList<Costos>();

        list.add(new Costos(1,3));
        list.add(new Costos(4,5));
        list.add(new Costos(2,7));

        // Using Method references

        Collections.sort(list, MultipleCompareMethods::compareByReferencia);
        System.out.println("\nOrdenado por Referencia");
        for (int i = 0; i < list.size(); i++)
            System.out.println(list.get(i));

        Collections.sort(list, MultipleCompareMethods::compareByMonto);
        System.out.println("\nOrdenado por Monto");
        for (int i = 0; i < list.size(); i++)
            System.out.println(list.get(i));


        // Using Comparator#comparingInt:

        Collections.sort(list, Comparator.comparingInt(c -> c.referencia));
        System.out.println("\nOrdenado por Referencia");
        for (int i = 0; i < list.size(); i++)
            System.out.println(list.get(i));

        Collections.sort(list, Comparator.comparingInt(c -> c.monto));
        System.out.println("\nOrdenado por Monto");
        for (int i = 0; i < list.size(); i++)
            System.out.println(list.get(i));

    }

    static int compareByReferencia(Costos c0, Costos c1)
    {
        return Integer.compare(c0.referencia, c1.referencia);
    }
    static int compareByMonto(Costos c0, Costos c1)
    {
        return Integer.compare(c0.monto, c1.monto);
    }

}


class Costos
{
    int referencia;
    int monto;

    Costos(int referencia, int monto)
    {
        this.referencia = referencia;
        this.monto = monto;
    }

    @Override
    public String toString()
    {
        return "COSTOS [referencia=" + referencia + ", monto=" + monto + "]";
    }
}


class Costos
{
    int referencia;
    int monto;

    Costos(int referencia, int monto)
    {
        this.referencia = referencia;
        this.monto = monto;
    }

    @Override
    public String toString()
    {
        return "COSTOS [referencia=" + referencia + ", monto=" + monto + "]";
    }
}

如果您在 class 中提供了类似 getReferencia 的方法,这可以更简洁地完成,再次使用方法参考:

Collections.sort(list, Comparator.comparingInt(Costos::getReferencia));

(自 Java 8 以来,几乎没有必要实际实现自己的比较器 classes...)