如何在 java8 中使用 compareTo 对链表进行排序

How to sort LinkedLists using compareTo in java8

我需要使用 compareTo() 对 StudentInfo 对象的链接列表 x 进行排序。

这是我的 StudentInfo 类

package mahaffy_lab4;
import java.util.*;
/**
 *
 * @author student
 */

 public class StudentInfo implements Comparable<StudentInfo>
 {

private LinkedList<Object> classes = new LinkedList<>();
private String sid, name;


public StudentInfo(String sid, String name)
{
    this.sid = sid;
    this.name = name;

}

public void AddClass(Object aClass)
{       
   classes.add(aClass);
}
@Override
public int compareTo(StudentInfo studentA)
{

    return this.name.compareTo(student.name);
}
@Override    
public String toString()
{
    return "Name: " + name + "   SID: " + sid;
}

}

但这就是我的问题所在。在我的 main/test class 中,我尝试过的都不起作用。这是我最后一次尝试:

private LinkedList<Object> students = new LinkedList<>();

public String GetAllStudents()
 {   

     Collections.sort(students, new Comparator<String>() {
         @Override
         public int compare(StudentInfo o1, StudentInfo o2) {
            return Collator.getInstance().compare(o1, o2);
         }            
     });   

     return students.toString();
 }

如有任何帮助,我们将不胜感激。

这应该是您的 StudentInfo class 和 Comparable 接口实现:

class StudentInfo implements Comparable<StudentInfo> {

    private final int num;

    @Override
    public int compareTo(StudentInfo studentA) {
        return Integer.compare(num, studentA.num);
    }
}

这是客户代码:

List<StudentInfo> studentInfos = new LinkedList<>();
Collections.sort(studentInfos);

您没有提供关于比较两个 StudentInfo 的详细信息。在本例中 StudentInfo 将根据它们的 num.

进行排序

P.S. 为了更加灵活,我建议您避免 implements Comparable<StudentInfo>。最好提供单独的比较器。此外,您以后可以添加更多。

StudentInfo 带有额外的比较器:

class StudentInfo {

    private final int num;
    private final String name;

    public static final Comparator<StudentInfo> SORT_BY_NUM = Comparator.comparingInt(s -> s.num);

    public static final Comparator<StudentInfo> SORT_BY_NAME = (s1, s2) -> {
        int res = s1.name.compareToIgnoreCase(s2.name);
        return res != 0 ? res : SORT_BY_NUM.compare(s1, s2);
    };

}

客户代码:

List<StudentInfo> studentInfos = new LinkedList<>();
studentInfos.sort(StudentInfo.SORT_BY_NUM);  // sort by num
studentInfos.sort(StudentInfo.SORT_BY_NAME); // sort by name
studentInfos.sort(StudentInfo.SORT_BY_NAME.reversed()); // sort by name reversed order

Collections.sort() 的方法签名(至少,您正在使用的版本)是 public static <T> void sort(List<T> list, Comparator<? super T> c) 换句话说,比较器的类型参数必须是类型参数的父类型对于列表。您传递的是 List<StudentInfo>,但传递的是 Comparator<String>。毕竟,您想比较 StudentInfo 个对象而不是 String 个对象。

您在这里有两个选择:StudentInfo.compareTo() 根据名称进行比较,例如您注释掉的行。然后,在您对 Collections.sort() 的调用中,不要包含另一个 Comparator.

或者,给 StudentInfo 某种 getName() 方法,然后改用这样的方法:

Collections.sort(students, new Comparator<StudentInfo>() {
         @Override
         public int compare(StudentInfo o1, StudentInfo o2) {
            return o1.getName().compareTo(o2.getName());
         }            
     });  

问题出在声明中:

private LinkedList<Object> students = new LinkedList<>();

LinkedList 是 Object 的列表,因此列表的值被比较为 Object,而不是 StudentInfo

要解决此问题,请重新声明列表:

private LinkedList<StudentInfo> students = new LinkedList<>();