为了账号安全,请及时绑定邮箱和手机立即绑定

如何对类的对象的 ArrayList 的部分进行排序?

如何对类的对象的 ArrayList 的部分进行排序?

明月笑刀无情 2021-11-03 16:12:50
我查看了许多看起来相似的问题,但没有一个能完全解决我的问题。我有一个名为 Student 的类,一个名为 RollManager 的类,以及一个名为 RollDriver 的驱动程序。Student 类允许用户输入学生的数据,例如他们的姓名、专业、GPA、分类等。RollManager 类有一个名为 classRoll 的 ArrayList,它保存 Student 类型的对象(如下所示: ArrayList<Student> classRoll = new ArrayList<>();在 RollDriver 中有一个菜单,允许用户做几件事。其中,我需要能够按名称对 Student 对象进行排序,以及一个允许我按 GPA 对它们进行排序的单独选项。问题是当我尝试使用 Collections.sort(classRoll) 时,它不知道如何对它们进行排序。所以我在 RollManager 类中创建了一个名为 sortName 的方法,但是我如何指定我要根据 Student 对象的“名称”值进行排序呢?这是我的一些代码:卷轴管理器:public static void sortName(ArrayList<Student> classRoll)    {        for(int i = 0; i < classRoll.size(); i++)        {            int pos = i;            for(int n = i; n < classRoll.size(); n++)            {                if(classRoll.get(n).equals(classRoll.get(pos)))                {                    pos = n;                }            }        }    }RollDriver 中的选项进行排序:else if(choice == 8)            {                RollManager.sortName(classRoll);                System.out.println (classRoll);            }运行它时我没有收到任何错误,但也没有任何反应。对象没有任何不同的排序。这些是我添加到 classRoll 以测试我的代码的一些预先添加的对象(分类是枚举):Student student2 = new Student("John", "Doe", "COMM", 120, 3.65, Classification.FRESHMAN);Student student3 = new Student("Bob", "Ross", "ARTS", 200, 3.99, Classification.OTHER);Student student4 = new Student("Liev", "Schreiber", "FILM", 100, 2.53, Classification.GRADUATE);Student student5 = new Student("Maury", "Povich", "PSCI", 75, 2.24, Classification.JUNIOR);Student student6 = new Student("Bill", "Leidermann", "CSCI", 90, 2.95, Classification.SENIOR);classRoll.add (student2);classRoll.add (student3);classRoll.add (student4);classRoll.add (student5);classRoll.add (student6);我希望这是足够的信息。如有必要,我可以发布更多代码。感谢您的任何帮助!
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您使用另Collections.sort一种方法:sort(List<T> list, Comparator<? super T> c)


你像这样使用它:


Collections.sort(classRoll, new Comparator<Student>() {

    @Override

    public int compare(Student s1, Student s2) {

        return s1.getName().compareTo(s2.getName());

    }

});

在 Java 8+ 中,它更容易:


// Sort by name

classRoll.sort(Comparator.comparing(Student::getName));


// Sort by GPA

classRoll.sort(Comparator.comparingDouble(Student::getGpa));

如果名称是 2 个字段(firstName和lastName),则可以使用thenComparing:


// Sort by last name, then first name

classRoll.sort(Comparator.comparing(Student::getLastName)

                         .thenComparing(Student::getFirstName));


查看完整回答
反对 回复 2021-11-03
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

这样做的方法是使用Collections.sort自定义比较器:


Comparator<Student> nameComparator = new Comparator<Student>() {

     public int compare(Student student1, Student student2) {

        return student1.getName().compareTo(student2.getName());

     }

  };


Comparator<Student> gpaComparator = new Comparator<Student>() {

     public int compare(Student student1, Student student2) {

        return student1.getGPA().compareTo(student2.getGPA());

     }

  };

然后您可以根据需要使用不同的比较器:


Collections.sort(classRoll, nameComparator);

通过这种方式,与上面具有 2 个循环的解决方案相比,您拥有一个优化的分拣机。


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信