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

}

当我运行这些我得到这个错误:线程“主”java.lang.StackOverflowError中的异常

我认为错误是返回 compareTo(o),但我不明白如何将我的 CURRENT 对象与传入的对象进行比较。

我也不知道如何使用“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) 比较两个人时,它应该返回一个值,表明 PersonA 小于 (-1) 等于 (0) 或大于 (1) PersonB

此解决方案旨在显示您尝试做什么的一般概念,更有效的解决方案是从彼此中减去值并返回,例如

return age - o.age;
于 2013-01-31T19:39:30.053 回答
1

您使您的方法compareTo递归,但没有任何可能停止此递归。在您的compareTo方法中,您必须添加一些将返回的条件int,例如:

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

这样,您将Person根据它们的age字段比较两个实例。您不能像整个实例那样与类的实例进行比较 - 这不是compareTo. 您必须对比较这两个实例的条件做出一些假设,在这里,由于您只有一个字段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 :)

    }

编辑:此外,抑制 rawtype 警告非常顽皮。原始类型与泛型完全相反。如果您收到原始类型警告,则说明您正在编写明确的非泛型代码!

于 2013-01-31T19:38:10.783 回答
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 回答