如何根据一个属性对对象的arraylist进行排序?

时间:2012-11-25 04:54:27

标签: java sorting object arraylist

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

4 个答案:

答案 0 :(得分: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

所以这就是你需要做的事情:

答案 1 :(得分:1)

您也可以使用您已经提到过的Comparer类。

如果从Student类实现Comparator类,则需要提供compare方法的实现,您可以在其中指定逻辑。执行Collections.sort(list,comparator)方法时将调用此方法。此外,您可以将调试点放在比较方法中,以确保它是如何被调用的。

您的问题的完整示例如下:

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

}

答案 2 :(得分:0)

试试这个:

ArrayList lsStudent = GetStudentData();

lsStudent.Sort((S1, S1) => Convert.ToInt32(S1.UID.Substring(1))
                          .CompareTo(Convert.ToInt32(S2.UID.Substring(1))));

这将解决您的问题。

答案 3 :(得分: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对学生对象集合进行排序。