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

时间:2018-06-18 20:23:18

标签: java linked-list compareto

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

这是我的StudentInfo clas

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;
}

}

但这是我的问题所在。在我的主要/测试课程中,我没有尝试过任何作品。这是我做的最后一次尝试:

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();
 }

请,任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

这应该是StudentInfoComparable接口实现:

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

答案 1 :(得分:0)

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

此处有两个选项:根据名称进行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());
         }            
     });  

答案 2 :(得分:0)

问题出在宣言中:

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

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

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

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