gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:07:09 24 4
gpt4 key购买 nike

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

现在假设我有这些值:

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

我如何编写一个比较器,使 Field 1 以升序排列,如果 Field 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.comparing() 方法,创建一个基于字段比较实例的 Comparator 非常简单。基于多个字段的比较是一个使用 .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 - 编写一个基于多个字段排序的比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34865410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com