1

年齢に基づいて従業員を並べ替えようとしています (単純化された例) が、単体テストを実行できません。

public class Employee{

    private int age;    

    public void setAge(int age){
        this.age=age;    
    }

    public int getAge(){
        return this.age;    
    }
}

私のコンパレータは次のようになります。

class AgeComparator implements Comparator<Employee>{

    public int compare(Employee emp1, Employee emp2){

        int emp1Age = emp1.getAge();        
        int emp2Age = emp2.getAge();

        if(emp1Age > emp2Age)
            return 1;
        else if(emp1Age < emp2Age)
            return -1;
        else
            return 0;    
    }
}

そして私の単体テスト:

public class AgeComparatorTest {

    @Test
    public void testAge(){
        Employee e1 = new Employee();
        e1.setAge(4);

        Employee e2 = new Employee();
        e2.setAge(7);

        List<Employee> employeeList = new ArrayList<Employee>();
        employeeList.add(e1);
        employeeList.add(e2);

        Collections.sort(employeeList, new AgeComparator());
        Employee actual = employeeList.get(0);

        Assert.assertEquals(e2.getAge(), actual.getAge());

    }
}

そして、7 歳の従業員は 4 歳より前であると予想していますが、わかります。

junit.framework.AssertionFailedError: 予想: <7> だったが: <4>

4

4 に答える 4

3

それらを昇順で並べ替えるので、これはまさにコードの予想される動作です。

このように単純化してComparator、必要な動作を得ることができることに注意してください。正確に返す必要はありません。-1/1正または負のいずれでもかまいませんint
[編集] @JBNizetがコメントで指摘しているように、単にemp2.getAge() - emp1.getAge()コンパレーターに戻ると、大きな値に対してオーバーフローする可能性があります。たとえば、次のGuava Ints.compare()方法を使用することをお勧めします。

class AgeComparator implements Comparator<Employee>{
    public int compare(Employee emp1, Employee emp2){
        return Ints.compare(emp2.getAge(), emp1.getAge());
    }
}
于 2012-07-29T11:50:43.503 に答える
2

コンパレータに問題はありません。アイテムを昇順で並べることを選択しただけです。

GuavaOrderingクラスをご覧になることをお勧めします。とても便利な方法がありreverseます。

昇順コンパレータを使用している場合は、昇順コンパレータの観点から実装された降順コンパレータを非常に簡単に作成できます。

コンパレータを降順ソート用に修正する場合は、宣言で変数名を切り替えて、ロジックを同じままにします。たとえば、

public int compare(Employee emp2, Employee emp1){
于 2012-07-29T11:50:21.177 に答える
0

if条件を変更し、比較条件を逆にします。自然順は小さいものから高いものへと続きますが、高いものから低いものへの順序が必要です

于 2012-07-29T11:53:17.370 に答える
0

java.utils.Collections指定されたリストを昇順で並べ替えるため、リストの最初の従業員は4歳です。

于 2012-07-29T11:51:16.510 に答える