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



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

这是我的主要课程:

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

我认为,您不想为每个排序顺序创建一个单独的类。但它并没有按照您尝试的方式工作。我认为,比较器是一个类型为"某物列表"的变量。也许你应该尝试这样的事情:

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

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

您应该以小写字母开头的变量名称(此处:比较器)。这是 Java 中的一般约定。

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

根据比较的实际方式,更简洁的形式是使用Comparator#comparing方法,正如多纳特在他的回答中提到的(+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 开始,几乎不需要实际实现自己的比较器类......

最新更新