我如何在一个 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...)
我正在按两个对象比较和排序多个属性,但为此我创建了不同的 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...)