2013-08-11 2 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; 
    } 
} 
} 

편집 : 뭔가를 잊고 있었다 감사합니다 : 원 추상하지 않고 오버라이드 (override)하는하지 않는 추상적 인 방법은 compareTo 내가 내려받은 것을 지금에 도움을 대등

감사에서 (객체) 시도는

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

'Circle extends Shape이 구현 한 클래스'로 선언해야합니다. '. 또한 [Java에서 문자열을 비교하는 방법?] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java)을 읽으십시오. 또한 현재 구현 된 것처럼 _smaller_ 원에 필요한 음의 반환 값은 절대 존재하지 않습니다. – jlordo

답변

3

당신은 결코 반환되지 않으며,이 예외가 어떤 아이디어를 팝업 TreeSet의에 원을 추가하면 -1이 방법에서, 클래스를 테스트. 원의 한쪽이 다른 쪽과 비교해 「큰」경우, 그 쪽이 1을 돌려주고, 다른 쪽이 큰 쪽과 비교하면 -1이 돌려 주어집니다. 서클이 전이 속성 및 기타 길드 라인을 준수하는지 확인해야합니다.

this reference to the compareTo()을 살펴보십시오.

0

현재 인스턴스가 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); 
} 
+0

[자바에서 문자열을 어떻게 비교합니까?] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – jlordo

+0

글쎄, 내 얼굴은 붉은 색이다. 감사합니다. 작고 바보 같은 실수. 결정된. –

+0

또한, 항상 동일하지 않은 이름에 대해 '1'을 반환하는 것은 잘못되었습니다. 'a'가 더 클 것이고'b'가'a'보다 더 클 것입니다. 'SortedSet'는 힘든 시간을 삽입합니다. – jlordo