如何在 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<>();
我需要使用 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<>();