我有一个学生对象的arrayList。这些对象都有共同的属性,例如名字和姓氏,UID(大学ID号)GPA,然后还有研究生和本科的子类。对于如何根据 UID 号按从低到高的顺序对数组列表进行排序,我一直很困惑。UID 号是 U123456 格式的 STRING。总是有一个 U,然后是不同数量的整数。由于 U,我无法解析为 int 并以这种方式排序,我已经看到Comparator
正在使用的类,但我不明白,因为它似乎只比较两个对象?!如果该Comparator
课程适用于此,有人可以向我解释它的作用和工作原理吗?
问问题
9096 次
4 回答
3
由于这种行为,很容易比较:
System.out.println("u1".compareTo("u2")); // -1
System.out.println("u2".compareTo("u2")); // 0
System.out.println("u3".compareTo("u2")); // 1
System.out.println("u4".compareTo("u2")); // 2
所以这就是你需要做的:
- 让
Student implement Comparable
...你可以看看http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html - 在学生中定义
compareTo(Student s)
,这只是return(this.id.compareTo(s.id));
- 只需使用 ArrayList 调用 sort()
于 2012-11-25T05:25:06.907 回答
1
正如您已经提到的,您也可以使用 Comparer 类。
如果您从 Student 类实现 Comparator 类,则需要提供 compare 方法的实现,您可以在其中指定逻辑。当您执行 Collections.sort(list, compare) 方法时,将调用此方法。此外,您可以将调试点放在比较方法中,以确保它是如何被调用的。
您的问题的完整示例如下:
import java.util.Comparator;
public class Student implements Comparator<Student>{
private String uid;
@Override
public int compare(Student o1, Student o2) {
Integer i1 = Integer.parseInt(o1.getUid().substring(1)); // Skip the first character U
Integer i2 = Integer.parseInt(o2.getUid().substring(1)); // Skip the first character U
if(i1 > i2 ){
return 1;
}else if(i1< i2){
return -1;
}else {
return 0;
}
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
}
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestSort {
public TestSort(){
Student s1 = new Student();
s1.setUid("U34334");
Student s2 = new Student();
s2.setUid("U64454");
Student s3 = new Student();
s3.setUid("U13344");
List<Student> list = new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list, new Student());
for(Student s : list){
System.out.println(s.getUid());
}
}
public static void main(String[] args){
new TestSort();
}
}
于 2012-11-25T06:33:25.580 回答
0
尝试这个 :
ArrayList lsStudent = GetStudentData();
lsStudent.Sort((S1, S1) => Convert.ToInt32(S1.UID.Substring(1))
.CompareTo(Convert.ToInt32(S2.UID.Substring(1))));
这将解决您的问题。
于 2012-11-25T05:25:27.890 回答
0
让你的Student
类实现Comparable
接口:
public class Student implements Comparable<Student> {
并在您的类中实现compareTo
方法Student
如下:
@Override
public int compareTo(Student s) {
return UID.compareToIgnoreCase(s.UID);
}
这里UID.compareToIgnoreCase(s.UID)
将处理您的字母数字值比较以进行排序。
然后只需使用Collections.sort
对您的学生对象集合进行排序。
于 2012-11-25T05:25:41.063 回答