【问题标题】:compareTo() implementation problemscompareTo() 实现问题
【发布时间】:2013-08-11 17:40:26
【问题描述】:

您好,我在实现 compareTo 方法时遇到了问题。我一直在寻找答案,但没有任何帮助。我正在尝试用各种大小的圆圈填充 TreeSet。我需要在我的圈子类中使用 compareTo 才能以这种方式存储它们。

import java.util.*;
import java.lang.*;

abstract class Shape
{ 
private String name; //e.g."circlel", "rectangle3" 

Shape(String name0) 
{
    name = name0;
} 

abstract double area (); // area of shape 

abstract double perim(); // length of perimeter of shape 

void put() 
{ // display shape details 
    System.out.println(name + " with area " + area() 
+ " and perimeter " + perim() );
}
} 

class Circle extends Shape implements Comparable
{
private static String name;
private int radius;

Circle(String n, int r)
{
    super(n);
    radius = r;
}

public double area()
{
    return Math.PI * radius * radius;
}

public double perim()
{
    return 2 * Math.PI * radius;
}

public int compareTo(Circle c)
{
    if(c.name == name && c.radius == radius)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
}

编辑:谢谢我忘记了一些东西: Circle 不是抽象的,不会覆盖 Comparable 中的抽象方法 compareTo(Object)

感谢您的帮助,现在我已经开始测试该类,当尝试向树集中添加一个圆圈时,此异常会弹出任何想法,

Exception in thread "main" java.lang.NullPointerException
        at Circle.compareTo(Shape.java:47)
        at Circle.compareTo(Shape.java:23)
        at java.util.TreeMap.compare(Unknown Source)
        at java.util.TreeMap.put(Unknown Source)
        at java.util.TreeSet.add(Unknown Source)
        at CircleTreeSet.main(CircleTreeSet.java:24)

【问题讨论】:

  • 如果您能获得更多关于您遇到的错误的信息,将会很有用。
  • 您需要将其声明为class Circle extends Shape implements Comparable<Circle>。另请阅读How do I compare strings in Java?。此外,正如当前实施的那样,永远不会有负返回值,这对于 较小的 圆圈是必需的。

标签: java inheritance interface compareto


【解决方案1】:

在这个方法中你永远不会返回 -1。如果其中一个圆圈与另一个圆圈相比“更大”,则该圆圈应返回 1,而另一个圆圈与较大的圆圈相比应返回 -1。您必须确保您的圈子遵循传递属性和其他一些准则。

看看this reference to the compareTo()

【讨论】:

    【解决方案2】:

    如果当前实例小于 c,则必须返回 -1,如果当前实例大于 c,则必须返回 1,如果实例相等,则返回 0。

    compareTo 就是这样工作的。现在,您将其更像是平等检查。 comparTo 不仅如此。它应该确定一个项目是等于、小于还是大于另一个项目。

    此代码将在排序时按大小顺序对具有相同名称的对象进行分组。对象也将按名称的字母顺序排序。

    public int compareTo(Circle c)
    {
        if(c.name.equals(name)){
            if(c.radius < radius)
            {
                return 1;
            }
            else if(c.radius>radius)
            {
                return -1;
            }
            return 0;
        }
        //names aren't the same compare alphabetically.
        return this.name.compareTo(c.name);
    }
    

    【讨论】:

    • 好吧,我的脸红了,感谢@jlordo,这是一个小而愚蠢的错误。固定。
    • 另外,对于不相等的名称总是返回 1 似乎是错误的。因为a 会大于bb 会同时大于aSortedSet 很难插入。
    • 同意,但这种情况确实没有正确的行为。
    • 用于在名称不相等时进行分组?这个具体案例就是我的意思。按名称分组和排序,当比较两个名称并且不相等时会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多