0

私はコンパレータを利用する以下を開発しました..

この私のポジョ..

  class Emp
{
      String name,job;
      int salary;
      public Emp(String n,String j,int sal)
      {
         name=n;
         job=j;
         salary=sal;
       }
      public void display()
      {
        System.out.println(name+"\t"+job+"\t"+salary);
       }
      public boolean equals(Object o)
      {
          Emp p=(Emp)o;
          return this.name.equals(p.name)&&this.job.equals(p.job)    &&this.salary==p.salary;
       }
       public int hashCode()
       {
          return name.hashCode()+job.hashCode()+salary;
       }  

} 

これは、set のユーザー定義コレクション クラスです。

  ArrayList list=new ArrayList();
          list.add(new Emp("Ram","Trainer",34000));
          list.add(new Emp("Sachin","Programmer",24000));
          list.add(new Emp("Priyanka","Manager",54000));
          list.add(1,new Emp("Ravi","Administrator",44000));
          list.add(new Emp("Anupam","Programmer",34000));
          list.add(new Emp("Sachin","Team Leader",54000));
          System.out.println("There are "+list.size()+" elements in the list.");
          System.out.println("Content of list are : ");
         ListIterator itr=list.listIterator();
          System.out.println("Sort Object according to Salary");
         Collections.sort(list,new SalaryComparator());
         System.out.println("Content of list are : ");
          itr=list.listIterator();
          while(itr.hasNext())
          {
            Emp e=(Emp)itr.next();  
            e.display();
          }
      }

そして最後に私のコンパレータクラス

class SalaryComparator
  implements Comparator
{
  public int compare(Object paramObject1, Object paramObject2)
  {
    Emp localEmp1 = (Emp)paramObject1;
    Emp localEmp2 = (Emp)paramObject2;
    return localEmp1.salary - localEmp2.salary;
  }
}

儀式は昇順で給与に基づいてソートされていますが、最初に給与に基づいてソートし、次に仕事に基づいてソートするようにコンパターにロジックを実装する方法を教えてください。つまり、最初の給与、次に仕事です。アドバイスします。

4

2 に答える 2

1

コンパレータ関数には、いつでも複数の比較を含めることができます。この場合:

class SalaryComparator
  implements Comparator
{
  public int compare(Object paramObject1, Object paramObject2)
  {
    Emp localEmp1 = (Emp)paramObject1;
    Emp localEmp2 = (Emp)paramObject2;
    int salaryDiff = localEmp1.salary - localEmp2.salary;
    if (salaryDiff != 0) {
      return salaryDiff;
    } else {
      if (localEmp1.job == null) {
        if (localEmp2.job == null) {
          return 0;
        } else {
          return 1;
        }
      } else {
        if (localEmp2.job == null) {
          return -1;
        } else {
          return localEmp1.job.compareTo(localEmp2.job);
        }
      }
    }
  }
}

このヌルチェックの設定により、Empインスタンスはジョブ値なしでアルファベット順のランキングの最後に配置されます。

于 2012-05-07T17:18:29.720 に答える
0

ジェネリックスを使用して、コードをよりタイプセーフにすることができます。

import java.util.*;

class Emp
// as is

// use Comparator <Emp> 
class SalaryComparator implements Comparator <Emp>
{
    // 'Emp' as param type, no casting or isinstanceof inside
    public int compare (Emp emp1, Emp emp2)
    {
        int diff = emp1.salary - emp2.salary;
        if (diff != 0) return diff; 
        else return (emp1.job.compareTo (emp2.job));
    }
}

public class EmpTest 
{
    public static void main (final String args[])
    {
        // how to use collections generically should be known by now:
        ArrayList <Emp> list = new ArrayList <Emp> ();
        list.add (new Emp ("Ram","Trainer", 34000));
        // ...

        // position 3 - slightly more complicated here ...
        ListIterator <Emp> itr = list.listIterator ();
        // ...
        while (itr.hasNext ())
        {
                // but simpler here:
            Emp e= itr.next ();  
            e.display ();
        }
    // here you could use the simplified for-loop:
    for (Emp e : list)
    {
        e.display ();
    }
    }
}
于 2012-05-07T17:41:40.087 に答える