0

こんにちは、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;
    }
}
}

編集:ありがとう、私は何かを忘れていました:サークルは抽象的ではなく、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)
4

2 に答える 2

3

このメソッドで -1 を返すことはありません。円の 1 つが他の円と比較して「大きい」場合、その円は 1 を返し、大きい円と比較した場合、もう 1 つの円は -1 を返す必要があります。円が推移的なプロパティやその他のガイドラインに従っていることを確認する必要があります。

この compareTo() への参照を見てください。

于 2013-08-11T17:46:35.630 に答える
0

現在のインスタンスが より小さい場合は -1 c、現在のインスタンスが より大きい場合は 1 c、インスタンスが等しい場合は 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);
}
于 2013-08-11T17:49:34.987 に答える