66

重複の可能性:
複数のキーを使用してJavaオブジェクトをソートする

このメソッドを使用する例は見つかりません。すべての例で2番目のパラメーター「null」が指定されています。このメソッドは、複数の基準に従ってクラスをソートするために使用されたと聞きましたが、例は見つかりませんでした。

public class Student implements Comparable<Student> {
String name;
int age;

public Student(String name, int age) {
    this.name = name;
    this.age = age;
}

@Override
public String toString() {
    return name + ":" + age;
}

@Override
public int compareTo(Student o) {
    Integer myAge = age;
    Integer oAge = o.age;
    return myAge.compareTo(oAge);
}

}

このクラスでは、名前と年齢に応じて生徒のリストを並べ替える場合、Collections sort(List、Comparator)メソッドを使用するにはどうすればよいですか。

4

4 に答える 4

122

既存のStudentクラスに基づいて、これが私が通常行う方法です。特に、複数のコンパレータが必要な場合はそうです。

public class Student implements Comparable<Student> {

    String name;
    int age;

    public Student(String name, int age) {
       this.name = name;
       this.age = age;
    }

    @Override
    public String toString() {
        return name + ":" + age;
    }

    @Override
    public int compareTo(Student o) {
        return Comparators.NAME.compare(this, o);
    }


    public static class Comparators {

        public static Comparator<Student> NAME = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.name.compareTo(o2.name);
            }
        };
        public static Comparator<Student> AGE = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.age - o2.age;
            }
        };
        public static Comparator<Student> NAMEANDAGE = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int i = o1.name.compareTo(o2.name);
                if (i == 0) {
                    i = o1.age - o2.age;
                }
                return i;
            }
        };
    }
}

使用法:

List<Student> studentList = new LinkedList<>();
Collections.sort(studentList, Student.Comparators.AGE);

編集

Java 8のリリース以降、Comparatorsラムダを使用して内部クラスを大幅に簡略化できる可能性があります。ComparatorJava 8では、オブジェクトの新しいメソッドも導入されていますthenComparing。これにより、各コンパレータをネストするときに手動でチェックする必要がなくなります。Student.Comparators以下は、これらの変更を考慮したクラスのJava8実装です。

public static class Comparators {
    public static final Comparator<Student> NAME = (Student o1, Student o2) -> o1.name.compareTo(o2.name);
    public static final Comparator<Student> AGE = (Student o1, Student o2) -> Integer.compare(o1.age, o2.age);
    public static final Comparator<Student> NAMEANDAGE = (Student o1, Student o2) -> NAME.thenComparing(AGE).compare(o1, o2);
}
于 2013-01-04T09:36:15.033 に答える
66

これは最も簡単な方法かもしれません-

Collections.sort(listOfStudent,new Comparator<Student>(){
                     public int compare(Student s1,Student s2){
                           // Write your logic here.
                     }});

Java 8(ラムダ式)の使用 -

listOfStudent.sort((s1, s2) -> s1.age - s2.age); 
于 2013-01-04T09:15:16.827 に答える
14

おそらく次のようなものが必要です。

Collections.sort(students, new Comparator<Student>() {
                     public int compare(Student s1, Student s2) {
                           if(s1.getName() != null && s2.getName() != null && s1.getName().comareTo(s1.getName()) != 0) {
                               return s1.getName().compareTo(s2.getName());
                           } else {
                             return s1.getAge().compareTo(s2.getAge());
                          }
                      }
);

これにより、最初に学生が名前順に並べ替えられます。名前が欠落している場合、または 2 人の生徒の名前が同じ場合は、年齢順に並べ替えられます。

于 2013-01-04T09:21:33.110 に答える
3

Collections sort(List,Comparator) を使用するには、 Comparator Interface を実装するクラスを作成し、Comparator Interfaceを介してその中に compare() のコードを作成する必要があります

次のようなことができます。

class StudentComparator implements Comparator
{
    public int compare (Student s1 Student s2)
    {
        // code to compare 2 students
    }
}

並べ替えるには、次のようにします。

 Collections.sort(List,new StudentComparator())
于 2013-01-04T09:15:31.283 に答える