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

Java 如何对类对象的ArrayList的部分进行排序?,java,arrays,sorting,arraylist,selection-sort,Java,Arrays,Sorting,Arraylist,Selection Sort,我看过很多被问到的问题,这些问题看起来很相似,但没有一个能完全解决我的问题 我有一个名为Student的类,一个名为RollManager的类和一个名为RollDriver的驱动程序。Student类允许用户输入学生的数据,例如他们的姓名、专业、GPA、分类等 RollManager类有一个名为classRoll的ArrayList,它保存Student类型的对象(如下所示:ArrayList classRoll=new ArrayList(); RollDriver中有一个菜单,允许用户执行多

我看过很多被问到的问题,这些问题看起来很相似,但没有一个能完全解决我的问题

我有一个名为Student的类,一个名为RollManager的类和一个名为RollDriver的驱动程序。Student类允许用户输入学生的数据,例如他们的姓名、专业、GPA、分类等

RollManager类有一个名为classRoll的ArrayList,它保存Student类型的对象(如下所示:
ArrayList classRoll=new ArrayList();

RollDriver中有一个菜单,允许用户执行多项操作。其中,我需要能够按学生对象的名称对学生对象进行排序,还有一个单独的选项,允许我按GPA对学生对象进行排序

问题是,当我尝试使用Collections.sort(classRoll)时,它不知道如何对它们进行排序。因此,我在RollManager类中创建了一个名为sortName的方法,但是我如何指定我要特别按照Student对象的“name”值进行排序?下面是我的一些代码:

RollManager:

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;
                }
            }
        }
    }
当我运行这个时,我没有收到任何错误,但是也没有发生任何事情。对象的排序没有任何不同

以下是我为测试代码而添加到classRoll中的一些预添加对象(分类是一个枚举):


我希望这是足够的信息。如果需要,我可以发布更多的代码。感谢您的帮助!

您使用其他
集合。排序方法:

您可以这样使用它:

Collections.sort(classRoll, new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        return s1.getName().compareTo(s2.getName());
    }
});
如果名称是两个字段(
firstName
lastName
),则可以使用
然后比较

// Sort by last name, then first name
classRoll.sort(Comparator.comparing(Student::getLastName)
                         .thenComparing(Student::getFirstName));

执行此操作的方法是使用带有自定义比较器的
集合.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());
     }
  };

这样,与上面有2个循环的解决方案相比,您就有了一个优化的排序器。

“看起来是这样的:ArrayList classRoll=new ArrayList()”我当然希望不是,因为这将使用原始泛型,您不应该这样做。它应该是:
ArrayList classRoll=new ArrayList()
@Andreas绝对如此,这就是我的代码中的格式,但我不确定这个网站上的格式是如何工作的,所以在第一个ArrayList之后,它以某种方式被删除了
// Sort by name
classRoll.sort(Comparator.comparing(Student::getName));

// Sort by GPA
classRoll.sort(Comparator.comparingDouble(Student::getGpa));
// Sort by last name, then first name
classRoll.sort(Comparator.comparing(Student::getLastName)
                         .thenComparing(Student::getFirstName));
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);