web-dev-qa-db-ja.com

Comparatorを使用してArrayListをソートする方法は?

静的メソッドを実装するクラス学生がいます

public static Comparator<Student> getCompByName()

これは、2つのStudentオブジェクトを属性「name」で比較するStudentの新しいコンパレータオブジェクトを返します。

関数getCompByName()を使用して、学生のArrayListを「名前」でソートして、これをテストする必要があります。

これが、StudentクラスのComparatorメソッドです。

public static Comparator<Student> getCompByName()
{   
 Comparator comp = new Comparator<Student>(){
     @Override
     public int compare(Student s1, Student s2)
     {
         return s1.name.compareTo(s2.name);
     }        
 };
 return comp;
}  

そして、私がテストする必要があるメイン

public static void main(String[] args)
{
    // TODO code application logic here

    //--------Student Class Test-------------------------------------------
    ArrayList<Student> students = new ArrayList();
    Student s1 = new Student("Mike");
    Student s2 = new Student("Hector");
    Student s3 = new Student("Reggie");
    Student s4 = new Student("zark");
    students.add(s1);
    students.add(s2);
    students.add(s3);
    students.add(S4);

    //Use getCompByName() from Student class to sort students

私のメインでgetCompByName()を使用して、実際にArrayListを名前でソートする方法を誰にも教えてもらえますか?コンパレータは初めてで、その使用法に苦労しています。このメソッドはコンパレータを返すため、これがどのように実装されるかはわかりません。私はgetCompByName()を使用してソートする必要があることを知っていますが、それを実装する方法がわかりません。

11
Reeggiie

Collections.sort(List、Comparator) メソッドを使用します。

Collections.sort(students, Student.getCompByName());

また、コードでListを宣言するときにListインターフェイスを使用するとよいでしょう。

List<Student> students = new ArrayList();

Student[]を使用してArrayListコンストラクターに渡すことでコードを強化することもできます。

public static void main(String[] args) {
    Student[] studentArr = new Student[]{new Student("Mike"),new Student("Hector"), new Student("Reggie"),new Student("zark")};
    List<Student> students = new ArrayList<Student>(Arrays.asList(studentArr));
    Collections.sort(students, Student.getCompByName());

    for(Student student:students){
        System.out.println(student.getName());
    }
}

完全なソースの要点 です。

16
Kevin Bowersox

Collections.sort() を使用します。

Collections.sort(students, getCompByName());

注:コンパレータをprivate static final変数にするのに役立つ場合があります。

注2:リストを変更inplace;新しいリストを作成しません。

5
fge