1

Javaジェネリックを使用してprogを作成し、Comparableを実装する必要があります。コードは基本的に 3 人の年齢を比較し、真か偽かを教えてくれるはずです。

クラスに「int age」変数を含める必要があります。

これは私がやったことです:

@SuppressWarnings("rawtypes")
public class Person implements Comparable<Person>{ 

    int age; 

    //He said you should have ("int age"), but I dont know how to do this without using generics?

    public Person(int age) 
    {
        this.age = age; 
    }

    public int compareTo(Person o) {
            return compareTo(o); 

    }


}

そして私の比較クラス:

public class OrderedTrio<T> {

    @SuppressWarnings("unused")
    public static void main(String[] args) 
    {
        //Create Person object
        Person personA = new Person(10); 
        Person personB = new Person(20);
        Person personC = new Person(30); 

        System.out.println(allEqual(personA, personB, personC)); 

        //Create Employee object 
    }

    //All Equal Method: Returns true if all 3 items are equal according to their equals method
    public static boolean allEqual(Person personA, Person personB, Person personC)
    {
        if(personA.compareTo(personB) ==0 && personB.compareTo(personC)==0)     //If A=B, B=C then A=C
            return true; 
        else
            return false; 
    }
    //Sort Method: Orders items

    //ToString Method: Output format: Item1, 2, 3

}

これらを実行すると、次のエラーが発生します: Exception in thread "main" java.lang.StackOverflowError

エラーはreturn compareTo(o)にあると思いますが、現在のオブジェクトと渡されたオブジェクトを比較する方法がわかりません。

また、「int age」変数を何に使用すればよいかわかりません。int と Person オブジェクトを比較することはできません。

4

4 に答える 4

3

はい、これによりスタックオーバーフローが発生します。compareTo 関数に無限再帰があり、それ自体を何度も呼び出しています。

compareTo 関数は、渡されたオブジェクトと比較して、このオブジェクトに与えたい「値」を表す int を返すことになっています。つまり、年齢に基づいて人物を比較したい場合、compareTo は次のような年齢変数に基づいて単純に int を返す必要があります。

compareTo(Person o){
    //i'm younger
    if (this.age < o.age)
         return -1;
    //i'm older
    if (this.age > o.age)
         return 1;
 //same age   
 return 0;
}

ここで、PersonA.compareTo(PersonB) を介して 2 人の人物を比較すると、PersonA が (-1) より小さい (0) と同じ、または (1) PersonB より大きいことを示す値が返されます。

このソリューションは、あなたがやろうとしていることの一般的な概念を示すことを目的としています。より効率的なソリューションは、値を互いに減算して返すことです。

return age - o.age;
于 2013-01-31T19:39:30.053 に答える
1
public int compareTo(Person o) {
        return age-o.age; // youngest first
        // return o.age-age; // oldest first   
}

また、 compareToに関するドキュメントを読んでください。あなたはしていないようです。

于 2013-01-31T19:36:21.353 に答える
1

メソッドをcompareTo再帰的にしましたが、この再帰を停止する可能性はありません。メソッド内に、次のcompareToような条件を追加する必要がありますint

public int compareTo(Person o) {
    return (age - o.age);
}

Personこのようにして、フィールドに基づいて2 つのインスタンスを比較しageます。インスタンス全体のように、クラスのインスタンスと比較することはできません。それは の役割ではありませんcompareTo。これら 2 つのインスタンスを比較する条件について、いくつかの仮定を立てる必要があります。ここでは、フィールドが 1 つしかないため、年齢に基づいageて比較することをお勧めします。Person

于 2013-01-31T19:35:21.277 に答える
1

これがスタック オーバーフロー エラーの原因です。

public int compareTo(Person o) {
        return compareTo(o); 

}

compareTo を呼び出し、compareTo を呼び出し、compareTo を呼び出し、.... を呼び出します。

整数値の単純な比較は次のようになります

    public int compareTo(Person o) {
            return age - o.age; //or to be java-y :
//Integer.valueOf(age).compareTo(Integer.valueOf(o.age)); 
//or Integer.signum(age - o.age);
//I personally don't trust people to use compareTo properly and not look for 1 or -1 :)

    }

編集:また、生のタイプの警告を抑制するのはかなりいたずらです。Raw Type はジェネリックの正反対です。生の型の警告が表示される場合は、明示的に非ジェネリック コードを記述しています。

于 2013-01-31T19:38:10.783 に答える