当前位置: 首页 > 知识库问答 >
问题:

阵列。使用Lambda排序,然后比较

赵渊
2023-03-14

我是Java新手,我正在尝试使用Lambda表达式和比较器。我有一个具有其他getter和toString方法的公共类人员:

public class Person { 
    private String name;
    private int age;
    private int computers;
    private double salary;

public Person(String name, int age, int computers, double salary){
    this.name = name;
    this.age = age;
    this.computers = computers;
    this.salary = salary;
    }

public String getName(){
    return this.name;
}

public int getAge(){
    return this.age;
}

public int getComputers(){
    return this.computers;
}

public double getSalary(){
    return this.salary;
}
@Override
public String toString(){
    return "Name: " + getName() + ", age: "+ getAge() +
            ", N° pc: " + getComputers() + ", salary: " + getSalary();
}


}

现在我想对一个Person[]列表进行排序,首先按String(降序)进行比较,然后按年龄(升序)进行比较,然后按计算机数量(降序)进行比较,最后按Salary(升序)进行比较。我无法实现可比较,因为如果我重写compareTo方法,它应该是升序或降序,我需要两者。我想知道是否可以在不创建自己的比较器类的情况下做到这一点。基本上我的代码几乎是正确的,但我不知道如何逆转thenCompingInt(Person::getComputer)...

import java.util.Arrays;
import java.util.Comparator;


public class PersonMain {
   public static void main (String args[]){

    Person[] people = new Person[]{
            new Person("Adam",  30, 6, 1800),
            new Person("Adam",  30, 6, 1500),
            new Person("Erik",  25, 1, 1300),
            new Person("Erik",  25, 3, 2000),
            new Person("Flora", 18, 1, 800 ),
            new Person("Flora", 43, 2, 789),
            new Person("Flora", 24, 5, 1100),
            new Person("Mark",  58, 2, 2400)
    };

    Arrays.sort(people, Comparator.comparing(Person::getName).reversed()
            .thenComparingInt(Person::getAge)
            .thenComparingInt(Person::getComputers)
            .thenComparingDouble(Person::getSalary)
            );

    for (Person p: people)
        System.out.println(p);
  }
}

正确的输出应该是:

Name: Mark,  age: 58, N° pc: 2, salary: 2400.0
Name: Flora, age: 18, N° pc: 1, salary:  800.0
Name: Flora, age: 24, N° pc: 5, salary: 1100.0
Name: Flora, age: 43, N° pc: 2, salary:  789.0
Name: Erik,  age: 25, N° pc: 3, salary: 2000.0
Name: Erik,  age: 25, N° pc: 1, salary: 1300.0
Name: Adam,  age: 30, N° pc: 6, salary: 1500.0
Name: Adam,  age: 30, N° pc: 6, salary: 1800.0

提前感谢大家!

共有1个答案

濮阳旺
2023-03-14

我认为您只需要单独创建计算机比较器:

Comparator.comparing(Person::getName).reversed()
          .thenComparingInt(Person::getAge)
          .thenComparing(Comparator.comparingInt(Person::getComputers).reversed())
          .thenComparingDouble(Person::getSalary)
 类似资料:
  • 我试图编写一个接受两个参数的函数,和。然后,它应该按照中给出的顺序对进行排序。例如,如果是,是,则函数应返回,排序中的顺序元素。 我按照下面的方式编写代码,但在arrays.sort处不断出现错误。我想我没有正确地使用lambda。你能具体说明我做错了什么吗?

  • 不过,我也有一些错误: 我的代码出了什么问题?

  • 问题内容: 我想在Go中排序一个二维数组。谁能建议我该怎么做? 例如,如果我有, 然后有类似的东西, 问题答案: 您必须定义自己如何对这种类型进行排序。您可以创建必要的方法来使用该 接口,并根据需要使用指针来更改数组值: https //play.golang.org/p/thdf-k2k3o 或使用该 函数,转换 为切片并提供适当的较少函数: https //play.golang.org/p/

  • 因此,我有两个大小相等的2D numpy数组,都是在两个不同的曲面上使用方法获得的。 数组中的每个值也是形式的数组(所以我基本上有一个带有1D元素的2D数组)。 基本上,我想根据条件对两者进行比较: 有没有更有效的方法可以做到这一点,而无需简单地迭代任何一个数组,如下所示?

  • 问题内容: 请查看下面的代码: 有人可以解释一下为什么输出是 代替 ? 因为在API中它表示优先级队列的元素是根据其自然顺序进行排序的。 问题答案: PriorityQueue基于优先级堆。尽管未对元素进行排序,但此数据结构允许非常快地检索最小元素。将元素添加到PriorityQueue的速度比向基于树的TreeSet快。由于未对元素进行排序,因此如API所述,迭代器“不会以任何特定顺序返回元素”

  • 问题内容: 是否有Java开源比较器可以按多个字段比较bean以进行多列排序?每列可以按升序或降序排序。 对于单列排序,可以与一起使用。 我知道编写此功能非常简单,但是如果已经编写并测试过轮子,那么重新发明轮子有什么好处? 问题答案: 我是几个月前写的。 只需从此类继承并重写doCompare-Method。然后使用设置链中的下一个比较器。比较器在此链中出现的越早,就越“重要”。 编辑: 另请参阅