如何在一个类中编写多个“ compareTo”方法?

时间:2018-10-31 20:00:47

标签: java comparator

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

这是我的主要课程:

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...,我的意思是为每个人创建了不同的类。

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

例如,以下是我创建的方法:

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);
    }

2 个答案:

答案 0 :(得分:1)

我认为,您不想为每个排序顺序创建一个单独的类。但这并不能像您尝试的那样工作。我认为,比较器是一个类型为List的变量。也许您应该尝试这样的事情:

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

这里的“比较”方法是从Java类库的Comparator类型静态导入的。这使您成为新的比较器,而无需使用新的命名顶级类。

您应使用小写字母开头变量名(此处为:Comparator)。这是Java中的常规约定。

答案 1 :(得分:0)

您无需创建实现Comparator接口的多个类,而只需创建多个进行比较的方法即可。然后,该方法本身基本上是{strong>(!)Comparator的实现,您可以使用方法引用将其传递给Collections#sort方法。

根据比较的实际发生方式,一种更简洁的形式是使用Comparator#comparing方法,例如Donat mentioned in his answer (+1)。具体来说,您可以在示例中使用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 + "]";
    }
}

如果您在类中提供了getReferencia之类的方法,则可以使用方法参考更简洁地完成此操作:

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

(自Java 8开始,几乎没有必要实际实现自己的比较器类...)