1

クエリの結果として、db からの Bean のリストがあります。

ビーンは次のとおりです。

    public class Employee implements Comparator<Employee> {

    protected String empId; //alphanumeric e.g.abc123
    protected String empFullName;   
    protected String empAddress;
    protected String dept;
    protected String project;

    public String getEmpId() {
        return empId;
    }
    public void setEmpId(String empId) {
        this.empId = empId;
    }
    public String getEmpFullName() {
        return empFullName;
    }
    public void setEmpFullName(String empFullName) {
        this.empFullName = empFullName;
    }
    public String getEmpAddress() {
        return empAddress;
    }
    public void setEmpAddress(String empAddress) {
        this.empAddress = empAddress;
    }
    public String getDept() {
        return dept;
    }
    public void setDept(String dept) {
        this.dept = dept;
    }
    public String getProject() {
        return project;
    }
    public void setProject(String project) {
        this.project = project;
    }

    @Override
    public int compare(Employee e1, Employee e2) {
        if (e1 == null && e2 == null) return 0; 

        if (e1 != null && e2 == null) return -1;
        if (e1 == null && e2 != null) return 1;

        return e1.empId.compareTo (e2.empId); 
    }



}

英数字の empId でソートするコンパレータがあります。

empId、dept、project で並べ替える最善の方法を知りたいです。

コードでは、次のようにすると、empId で並べ替えられます。

    List<Employee> empList = someDao.getEmpList();
    Collections.sort(empList, new Employee());

助言がありますか。

4

2 に答える 2

5

これはそれ自体が奇妙な宣言です。

public class Employee implements Comparator<Employee>

次のようなものがはるかに一般的です。

public class Employee implements Comparable<Employee>

そして多分:

public class EmployeeByIdComparator implements Comparator<Employee>

public class EmployeeByNameComparator implements Comparator<Employee>

実装するクラスのインスタンスは、それ自体を別のインスタンスとComparable比較する方法を知っています。通常、これは「自然な」注文のために予約されています。これを、通常は異なるタイプの2つのインスタンス(のtype引数として指定されたインスタンス)を比較する方法を知っているのインスタンスと比較します。ComparatorComparator

したがって、複数のタイプの比較が必要な場合は、複数のコンパレータを作成してください。次に、それらをチェーン化することをお勧めします-Guavaはこれを行う簡単な方法を提供します。(を参照してくださいComparisonChain。)便宜上、コンパレータを内のプライベート静的クラスとして実装し、Employeeパブリック静的最終フィールドを介してそれらの単一インスタンスを公開することができます。

public class Employee
{
    public static final Comparator<Employee> BY_ID_COMPARATOR
        = new ByIdComparator();

    private static final class ByIdComparator : Comparator<Employee>
    {
        ...
    }
}
于 2012-09-07T16:25:22.640 に答える
0

public class Employee implements Comparator<Employee>

これは、Comparatorインターフェイスの間違った(おそらく意図されていない)使用法です。ここが欲しいと思いますComparable

empIdで並べ替えるために、deptとprojectは、それを実行するカスタムコンパレータを作成し、それをsort()メソッドに渡します。次に、このコンパレータは、比較するプロパティを必要な順序でチェックし、最初に0でない場合、またはすべてのプロパティが等しい場合は最後に結果を返します。

例:

new Comparator<Employee>() {
  public int compare(Employee e1, Employee e2) {
    //check if both are not null

    int result = e1.empId.compareTo( e2.empId );

    if( result == 0) {
      result = e1.dept .compareTo( e2.dept );
    }

    ...

    return result;
  }
}
于 2012-09-07T16:27:06.833 に答える