проблемы с реализацией compareTo()

Привет, у меня проблемы с реализацией метода 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;
    }
}
}

Изменить: спасибо, я кое-что забыл: круг не является абстрактным и не переопределяет абстрактный метод compareTo (Object) в Comparable

Спасибо за помощь в этом, теперь, когда я приступил к тестированию класса, при попытке добавить круг в набор деревьев это исключение всплывает любые идеи,

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)

person Bungalo Soldier    schedule 11.08.2013    source источник
comment
Было бы полезно получить дополнительную информацию о том, какие ошибки вы получаете.   -  person Niklas Lindblad    schedule 11.08.2013
comment
Вам нужно объявить его как class Circle extends Shape implements Comparable<Circle>. Также прочитайте Как сравнивать строки в Java?. Кроме того, в текущей реализации никогда не будет возвращаемого отрицательного значения, которое необходимо для меньших кругов.   -  person jlordo    schedule 11.08.2013


Ответы (2)


Вы никогда не возвращаете -1 в этом методе. Если один из кругов «больше» по сравнению с другим, этот должен вернуть 1, а другой, по сравнению с большим, должен вернуть -1. Вы должны убедиться, что ваш круг следует транзитивным свойствам и некоторым другим рекомендациям.

Взгляните на эту ссылку на сравнение().

person Jsdodgers    schedule 11.08.2013

Вы должны вернуть -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);
}
person William Morrison    schedule 11.08.2013
comment
comment
Ну, мое лицо красное, спасибо @jlordo, это была небольшая глупая ошибка. Исправлена. - person William Morrison; 11.08.2013
comment
Кроме того, всегда возвращать 1 для неравных имен кажется неправильным. Поскольку a будет больше, чем b, а b будет больше, чем a одновременно. SortedSet было бы трудно вставить. - person jlordo; 11.08.2013
comment
Согласен, но на самом деле нет правильного поведения для этого случая. - person William Morrison; 11.08.2013
comment
Для группировки, когда имена не равны? Я имею в виду именно этот конкретный случай. Группировать и сортировать по именам, что происходит, когда сравниваются 2 имени и они не равны? - person William Morrison; 11.08.2013
comment
Кто говорит о группировке? Из вопроса: Я пытаюсь заполнить TreeSet кругами разного размера В этом случае я бы return name.compareTo(c.name); отсортировал его в алфавитном порядке. - person jlordo; 11.08.2013
comment
Но, проверив, что имена равны, он выполняет группировку и сортировку по имени. - person William Morrison; 11.08.2013
comment
Неважно, как они сгруппированы или отсортированы. Я полагал, что вы не можете хранить объекты в наборе без реализации compareTo внутри класса, чтобы набор мог различать объекты. - person Bungalo Soldier; 11.08.2013
comment
Отлично, надеюсь, мое решение поможет вам. - person William Morrison; 11.08.2013
comment
@BungaloSoldier: вы можете просто использовать HashSet вместо TreeSet. В этом случае вам необходимо переопределить hashCode() и equals(). - person jlordo; 11.08.2013