2013-08-11 6 views
0

Привет, у меня возникли проблемы с реализацией метода compareTo. Я искал ответы, но ничто не помогло. Я пытаюсь заполнить TreeSet различными кругами. Мне нужно compareTo в моем классе круга, чтобы иметь возможность хранить их таким образом.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; 
    } 
} 
} 

Edit: Спасибо, я забывала что-то: Круг не является абстрактным и не overide абстрактный метод CompareTo (Object) в сравнимых

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

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) 
+0

Было бы полезно с дополнительной информацией о том, какие ошибки вы получите. –

+0

Вам нужно объявить его как 'class Circle extends Shape реализует Comparable '. Также читаем [Как сравнить строки в Java?] (Http://stackoverflow.com/questions/513832/how-do-compare-strings-in-java). Кроме того, как в настоящее время реализовано, никогда не будет отрицательного возвращаемого значения, которое необходимо для кругов _smaller_. – jlordo

ответ

3

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

Посмотрите на this reference to the compareTo().

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); 
} 
+0

[Как сравнить строки в Java?] (Http://stackoverflow.com/questions/513832/how-do-compare-strings-in-java) – jlordo

+0

Ну, мое лицо красное, спасибо @jlordo, что было маленькая, глупая ошибка. Исправлена. –

+0

Кроме того, всегда возвращается '1' для неравных имен, кажется неправильным. Поскольку 'a' будет больше, чем' b' и 'b' будут больше, чем' a' в то же время. «SortedSet» будет трудно вставлять. – jlordo