2014-02-28 5 views
0

TreeSet을 만들려는 자체 클래스를 만들었습니다. 내 수업은 다음과 같습니다 :Java에서 TreeSet 사용

class mytree implements Comparable 
{ 
    int line_no; 
    line_segment line[]; 

    public int compareTo(Object obj) 
    { 
     tree t = (tree)obj; 
     if(this.line_no == t.line_no) 
      return 0; 
     if(this.line[line_no]>t.line[line_no]) 
      return 1; 
     else 
      return -1; 

    } 
} 

나는 클래스의 새 객체를 정의한 다음 TreeSet에 삽입하려고합니다. 경우에 는

mytree up = tree.lower(n1); 
mytree down = tree.higher(n2); 

같은 값을 발견하고 난하지만 난 확인하려고하면 트리에 존재 위아래의 값은 때로는 나무가 값이없는 존재 할 수 있다고 말한다 발생 여부 나무와 때로는 값이 존재한다고 때로는 말합니다. 비교 메서드에서 0의 경우를 처리했지만 트리를 만들 때 발생할 수있는 오류는 무엇입니까?

답변

0

이 코드에서 잘못된 여러 가지가 있습니다. 우선, Java 관례를 전혀 존중하지 않습니다. 둘째, Java 5가 아직 존재하지 않았던 2004 년에 여전히 존재하는 것처럼 generics를 사용하지 않고 있습니다. 셋째, 수업은 나무를 나타내지 않으므로 mytree으로 지정하면 안됩니다. 넷째, compareTo() 방법이 잘못되었습니다. 대칭해야하는데 :

A> B < ==> B <을

A와 B의 line[line_no]가 동일한 경우 A.compareTo(B)과 비교하면, 다음, 비교 방법은 -1을 리턴합니다. B.compareTo(A)과 비교하면 -1도 반환됩니다. 그래서 당신은 A < B와 B < A를 동시에 가지고 있습니다.

0
if(this.line_no == t.line_no) 
     return 0; 
    if(this.line[line_no]>t.line[line_no]) 
     return 1; 

이 두 가지 검사에서 두 가지 다른 점을 비교하고 있습니다. 같은 것을 비교해야한다고 생각합니다.

if(this.line_no == t.line_no) 
     return 0; 
    if(this.line_no > t.line_no) 
     return 1; 

또는

// also note you probably mean t.line[t.line_no] instead of t.line[line_no] 
    if(this.line[line_no] == t.line[t.line_no]) 
     return 0; 
    if(this.line[line_no]>t.line[t.line_no]) 
     return 1;