1

我有一个学生对象的arrayList。这些对象都有共同的属性,例如名字和姓氏,UID(大学ID号)GPA,然后还有研究生和本科的子类。对于如何根据 UID 号按从低到高的顺序对数组列表进行排序,我一直很困惑。UID 号是 U123456 格式的 STRING。总是有一个 U,然后是不同数量的整数。由于 U,我无法解析为 int 并以这种方式排序,我已经看到Comparator正在使用的类,但我不明白,因为它似乎只比较两个对象?!如果该Comparator课程适用于此,有人可以向我解释它的作用和工作原理吗?

4

4 回答 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

所以这就是你需要做的:

于 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 回答