我需要使用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();
}
请,任何帮助将不胜感激。
答案 0 :(得分:1)
这应该是StudentInfo
类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
答案 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<>();