编程语言
首页 > 编程语言> > java-编写一个基于多个字段排序的比较器

java-编写一个基于多个字段排序的比较器

作者:互联网

我有3个数据字段,我们将其命名为字段1,字段2,字段3

现在让我们说这些值:

Field 1  Field 2  Field 3
    1       3        4
    2       3        3
    3       3        5
    4       2        5

我该如何编写一个比较器,使其排序,使我将字段1升序排列,如果字段2相等,则它将按降序对字段3排序.结果应该是这样的:

Field 1  Field 2  Field 3
    1       3        5
    2       3        4
    3       3        3
    4       2        5

我可能需要交换值,但这没关系.

解决方法:

编辑:我误解了问题.此解决方案按字段1,字段2,字段3排序.这不是OP所要的.

我怀疑您有一个包含这三个字段的Java对象.我假设可以通过getter访问它们.我还将假设您的对象存储在某种列表中.

您尚未指定要使用的Java版本,因此我将使用Java 8解决方案.可以将其与Java的早期版本一起使用,但是会更加冗长.

    List<MyObject> myObjects = Arrays.asList(new MyObject(1, 2, 3),
                                             new MyObject(0, 1, 2),
                                             new MyObject(1, 1, 1),
                                             new MyObject(1, 1, 0),
                                             new MyObject(1, 2, 1));
    List<MyObject> sortedList = myObjects.stream()
                                         .sorted(Comparator.comparing(MyObject::getField1)
                                                           .thenComparing(MyObject::getField2)
                                                           .thenComparing(MyObject::getField3))
                                         .collect(Collectors.toList());

    System.out.println(sortedList);

该程序输出

[0-1-2, 1-1-0, 1-1-1, 1-2-1, 1-2-3]

该解决方案将Java 8 Stream API与sorted()方法结合使用,使您可以轻松地对Stream进行排序.排序是通过使用Comparator实现的,Comparator是一个简单的类,可以确定两个实例中的哪个“大于”另一个实例.

感谢Comparator.comparing()方法,创建一个基于字段比较实例的比较器非常简单.基于多个字段进行比较是使用.thenComparing()链接返回的Comparator的简单过程.

Java 8方法引用用于引用字段的getter.

完整代码:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class MyObject
{
    private int field1;
    private int field2;
    private int field3;

    public MyObject(int field1,
                    int field2,
                    int field3)
    {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;
    }

    public int getField1()
    {
        return field1;
    }

    public int getField2()
    {
        return field2;
    }

    public int getField3()
    {
        return field3;
    }

    @Override
    public String toString()
    {
        return field1 + "-" + field2 + "-" + field3;
    }

    public static void main(String[] args)
    {
        List<MyObject> myObjects = Arrays.asList(new MyObject(1, 2, 3),
                                                 new MyObject(0, 1, 2),
                                                 new MyObject(1, 1, 1),
                                                 new MyObject(1, 1, 0),
                                                 new MyObject(1, 2, 1));
        List<MyObject> sortedList = myObjects.stream()
                                             .sorted(Comparator.comparing(MyObject::getField1)
                                                               .thenComparing(MyObject::getField2)
                                                               .thenComparing(MyObject::getField3))
                                             .collect(Collectors.toList());

        System.out.println(sortedList);
    }
}

标签:java-7,java,sorting
来源: https://codeday.me/bug/20191027/1944594.html