1. ホーム
  2. java

[解決済み] Collections sort(List<T>,Comparator<? super T>)メソッド例【重複あり

2022-03-06 20:29:33

質問

<ブロッククオート

重複の可能性があります。
複数のキーで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);
}

}

このクラスでは、私は彼らの名前&ランプに従って学生のリストをソートしたい場合、私はどのようにメソッドを使用することができますコレクションsort(リスト、コンパレータ)年齢。

どのように解決するのですか?

既存の スチューデント クラスで、特に複数のコンパレータが必要な場合、私は通常このようにします。

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

EDIT

Java 8 のリリース以降、インナークラス Comparators は、ラムダを使って大幅に簡略化することができます。また、Java 8 では Comparator オブジェクト thenComparing これにより、コンパレータをネストする際に、各コンパレータを手動でチェックする必要がなくなります。以下は、Java 8で実装された Student.Comparators クラスは、これらの変更を考慮した上で

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