Java 我怎么能写多个“;“比较”;一个类中的方法?

Java 我怎么能写多个“;“比较”;一个类中的方法?,java,comparator,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 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));

我认为,您不想为每个排序顺序创建单独的类。但它没有像你尝试的那样起作用。我认为,Comparator是一个变量,它的类型是列表。也许你应该试试这样:

comparator.sort(comparing(c -> c.referencia));
System.out.println("\nOrdenado por Referencia");
comparator.forEach(System.out::println);
这里的“comparing”方法是从Java类库的类型比较器进行的静态导入。这使您成为一个新的比较器,而不需要新的命名顶级类


变量名(这里是Comparator)应该以小写字母开头。这是Java中的一般约定。

您可以创建多个方法来进行比较,而不是创建多个实现
Comparator接口的类。然后,方法本身基本上是(!)比较器
的实现,您可以使用方法引用将其传递给
集合#sort
方法

根据比较实际发生的方式,更简洁的形式是使用方法,如图所示。具体来说,您可以在示例中使用
comparingit
。这两种方法如下所示:

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 + "]";
    }
}

(自从Java8以来,几乎没有必要真正实现自己的比较器类……

为什么?您的实际目标是什么?通常在类中定义
compareTo()
方法,在大多数情况下,该方法将用于对对象集合进行排序。然后,如果您在某些地方需要不同的排序顺序,您可以创建单独的
比较器类?顺便问一下,我这样做没关系吧?我的主要目标是少用课堂谢谢!!这就是我要找的!只有一个问题。。。“::”是什么意思?就在这里:Collections.sort(list,MultipleCompareMethods::compareByMonto);参见:
SomeClass::someMethod
的含义大致可以想象为“这是一个只包含一个方法的对象,即,
someMethod
”。(在您的例子中,可以将其想象为“比较对象”)
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 + "]";
    }
}
Collections.sort(list, Comparator.comparingInt(Costos::getReferencia));