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

根据对象JAVA 11中值的自定义优先级对对象列表进行排序[重复]

关宏毅
2023-03-14
List.of(
                new Student("Sam", "Pass", "100"),
                new Student("Gill", "Not available", "101"),
                new Student("Joe", "Fail", "111"),
                new Student("Matt", "Fail", "115"),
                new Student("Ann", "Pass", "121"),
                new Student("Moss", "Pass", "133"),
        );
  1. 按学生成绩的先后顺序,按“不及格”、“及格”、“不可用”(不按字母顺序)排序,成绩不及格的学生应排在名单的首位。然后是“通过”,然后是“不可用”
  2. 如果多个学生的结果相同,则按卷号升序排序。

最终结果应该如下所示。

{"Joe", "Fail", "111"}
{"Matt", "Fail", "115"}
{"Sam", "Pass", "100"}
{"Ann", "Pass", "121"}
{"Moss", "Pass", "133"}
{"Gill", "Not available", "101"}

共有1个答案

祁建业
2023-03-14

从Java8开始,我们可以对多个字段进行流排序

当你想按优先级“未通过”、“通过”、“不可用”排序时,一个选择是在学生中添加一个额外的字段。这将有助于在没有自然顺序时决定排序的优先级。在这个例子中,学生按“通过”、“失败”、“不可用”排序,然后按姓名排序,只是为了显示更多的选项。

排序代码段:

    Comparator<Student> compareByPriorityThenName =
            Comparator.comparing(Student::getPriority)
                    .thenComparing(Student::getName);

    List<Student> sortedStudents = students.stream()
            .sorted(compareByPriorityThenName)
            .collect(Collectors.toList());
public static void main(String []args){

    List<Student> students = List.of(
            new Student("Sam", "Pass", "100"),
            new Student("Gill", "Not available", "101"),
            new Student("Joe", "Fail", "111"),
            new Student("Matt", "Fail", "115"),
            new Student("Ann", "Pass", "121"),
            new Student("Moss", "Pass", "133")
    );

    Comparator<Student> compareByPriorityThenName =
            Comparator.comparing(Student::getPriority)
                    .thenComparing(Student::getName);

    List<Student> sortedStudents = students.stream()
            .sorted(compareByPriorityThenName)
            .collect(Collectors.toList());

    sortedStudents.forEach(System.out::println);
}
Student{name='Ann', result='Pass', rollNo='121', priority='1'}
Student{name='Moss', result='Pass', rollNo='133', priority='1'}
Student{name='Sam', result='Pass', rollNo='100', priority='1'}
Student{name='Joe', result='Fail', rollNo='111', priority='2'}
Student{name='Matt', result='Fail', rollNo='115', priority='2'}
Student{name='Gill', result='Not available', rollNo='101', priority='3'}
private int priority;
public int getPriority() {
    setPriority();
    return priority;
}

private int setPriority() {
    if(priority > 0) {
        return priority;
    }

    switch(result) {
    case "Pass":
        priority = 1;
        break;
    case "Fail":
        priority = 2;
        break;
    default:
        priority = 3;
    }
    return priority;
}
public class Student {

    private final String name;
    private final String result;
    private final String rollNo;
    private int priority;

    public Student(String name, String result, String rollNo) {
        this.name = name;
        this.result = result;
        this.rollNo = rollNo;
        this.priority = 0;
    }

    public String getName() {
        return name;
    }

    public String getResult() {
        return result;
    }

    public String getRollNo() {
        return rollNo;
    }

    public int getPriority() {
        setPriority();
        return priority;
    }

    private int setPriority() {
        if(priority > 0) {
            return priority;
        }

        switch(result) {
        case "Pass":
            priority = 1;
            break;
        case "Fail":
            priority = 2;
            break;
        default:
            priority = 3;
        }
        return priority;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", result='" + result + '\'' +
                ", rollNo='" + rollNo + '\'' +
                ", priority='" + priority + '\'' +
                '}';
    }
}
 类似资料:
  • 我的优先级队列有问题,无法正确排序对象值。 我的代码获取一个文本字符串,并获取唯一字符的数量,同时计算每个唯一字符的频率。然后将其放入字符和整数类型的映射中,并分别指定键和值。 然后,它获取映射的每个条目,并将其放入一个PQNode对象中,该对象也是Character、Integer类型,然后将其提供给优先级队列。 优先级队列是通过PQN中的comareTo方法按频率(值)从最低到最高对PQNod

  • Employee是上面定义的类之一,Address是Employee字段之一的数据类型之一。列表需要根据员工的字段中的进行排序。 这可以通过编写自定义比较器来完成。我正在寻找一种使用JavaLambda进行排序并获得排序列表的方法?

  • 问题内容: 这个问题已经在这里有了答案 : 如何根据对象的属性对对象列表进行排序? (8个答案) 1年前关闭。 我有一个看起来像这样的对象列表。 Card(10,’H)在这里不是元组,而是对象。我知道如果列表中的每个项目都是元组形式的,如何对列表进行排序,就像这样, 但我不知道如何对对象列表进行排序。我想按第一个输入值(即Card()中的数字)对列表进行排序 我怎样才能做到这一点? 编辑:这是Ca

  • 我有一个小问题,希望你能帮我解决。 我有一个名为Entity的类,它有几个属性,其中两个属性是id和实用程序: 然后,我在ArrayList中有几个Entity对象,如下所示: 现在,我想根据公用事业实体对列表进行排序。我使用一个定制的比较器,尝试了几种类似我在这里读到的解决方案: 但是在这条线上: 我遇到了以下错误:int不能被解引用,我不知道如何修复它。你们能帮我解决这个问题或者给出另一个解决

  • 问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。