2016-05-24 18 views
0

私のオフィスの一人の建築家が、コンパレータと同等の違いがあると私に話したら、 Comparatorは、2つの異なるクラスオブジェクト間を比較します。ここでは、同等クラスは同じクラス内で比較されます。私はクラス訓練生とクラスを持っています。私は学生と訓練生のクラスの中で同時に名前を並べ替えたい。学生の名前はほとんどなく、訓練生にはほとんど名前がありません。これらすべての名前を自然順にソートしたい。達成することは可能ですか?以下はエラーのあるコードです。Javaのコンパレータを使用したカスタムソート

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

class Student { 
String empName; 

Student(String empName) { 
    this.empName = empName; 
} 
} 

class Trainee { 
String studName; 

Trainee(String studName) { 
    this.studName = studName; 
} 
} 

public class Sort implements Comparator { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    Student st = new Student("caroline"); 
    Student st1 = new Student("elley"); 
    Student st2 = new Student("fannah"); 
    Trainee tr = new Trainee("aundh"); 
    Trainee tr1 = new Trainee("Rohit"); 
    Trainee tr2 = new Trainee("Shammi"); 
    List list = new ArrayList<>(); 
    list.add(st); 
    list.add(st1); 
    list.add(st2); 
    ArrayList list2 = new ArrayList<>(); 
    list2.add(tr); 
    list2.add(tr1); 
    list2.add(tr2); 
    Collections.sort(Student, new Comparator<Trainee>() { 
     @Override 
     public int compare(Student s, Trainee t) { 
      // TODO return 1 if rhs should be before lhs 
      return s.empName.compareToIgnoreCase(t.studName); 
     } 

    }); 

    } 

    } 

答えて

0

私はこのためにコンパレータが必要かどうか疑問です。文字列はデフォルトで自然順にソートされます。

list = Collections.sort(list); 
list2 = Collections.sort(list2); 

は、必要なものを提供します。

あなたが書いたコンパレータは意味をなさないので、コンパイルされません。両方のパラメータは同じクラスでなければなりません。これは、互いに関係するリストではない単一のリストを注文するために使用されます。

この

Collections.sort(Student, new Comparator<Trainee>() { 

はあなたが私はあなたを与えている比較方法を使用してソート研修生の私のリストを言っているのさ

Collections.sort(list2 , new Comparator<Trainee>() { 

でなければなりません。

あなたは、訓練生のクラスを分類しないで、訓練生のインスタンスのコレクションをソートします。

1

より良いオプションは、あなたの階層内の共通インターフェイスまたはオブジェクトを使用して、あなたの学生を導出することである

public class NameComparator implements Comparator{ 

    @Override 
    public int compare(Object o1, Object o2) { 
     Student s1 = o1 instanceof Student ? (Student)o1 : null; 
     Student s2 = o2 instanceof Student ? (Student)o2 : null; 
     Trainee t1 = o1 instanceof Trainee ? (Trainee)o1 : null; 
     Trainee t2 = o2 instanceof Trainee ? (Trainee)o2 : null; 
     String st1 = s1 != null ? s1.empName; t1 != null ? t1.studName; null; 
     String st2 = s2 != null ? s2.empName; t2 != null ? t2.studName; null; 
     return st1 != null ? st1.compareTo(st2): 0; 
    } 

} 

を非常に読めないコードになり、悪い設計を示していることをやっての汚いやり方がありますその共通の対象からの訓練生。

関連する問題