2012-05-23 3 views
0

일부 요소의 역사적인 뷰를 개발 중입니다. 각 요소에는 시작 날짜와 종료 날짜가 있습니다. 마침표가 겹칠 수 없으므로 각 시작 날짜는 이전 날짜와 같거나 그 이후 여야합니다. 종료 날짜가 널 (NULL)이면 요소는 시작 날짜부터 종료 날짜를 알 수있을 때까지 활성화됩니다.TreeSet의 Look-Up 동등 요소

public class Entry implements Comparable<Entry> 
{ 
    Integer start; 
    Integer end; 

    public Entry(Integer s, Integer e) 
    { 
     start = s; 
     end = e; 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (obj instanceof Entry) 
     { 
      return compareTo((Entry) obj) == 0; 
     } 
     return false; 
    } 

    @Override 
    public int compareTo(Entry o) 
    { 
     if (o.end != null // other ends before or when this starts 
       && (o.end.equals(start) || o.end < start)) 
     { 
      return 1; 
     } 
     if (end != null // other starts after or when this ends 
       && (o.start.equals(end) || o.start > end)) 
     { 
      return -1; 
     } 
     return 0; 
    } 
} 

내가 요소를 정렬 할 TreeSet의를 사용

는 테스트를 위해 나는이 클래스를 만들었습니다. 이제 현재 활성 또는 첫 번째 요소를 가져올 수 없다는 문제가 있습니다.

JavaDoc을 보면 트릭해야 천장 방법 :

는 그러한 요소가 존재하지 않는 경우는이 요소 속에서 최소보다 크거나 지정된 요소와 동일한, 또는 null 설정 돌려줍니다.

그러나 이것은 작동하지 않습니다.

ts.ceiling(new Entry(5, null)); 

내가 기대 그 결과로 항목입니다 :

TreeSet<Entry> ts = new TreeSet<Entry>(); 
ts.add(new Entry(1, 3)); 
ts.add(new Entry(3, 5)); 
ts.add(new Entry(5, 7)); 
ts.add(new Entry(7, 9)); 
ts.add(new Entry(9, 11)); 
ts.add(new Entry(11, 13)); 
ts.add(new Entry(13, 15)); 

그런 다음 나는 다음과 같은 코드를 사용하여 천장을 얻을 : 테스트 케이스에

나는 항목의 무리와 함께 TreeSet의를 만들 5를 시작하고 7을 끝내십시오 ('동일'항목). 그러나 결과는 시작이 7이고 끝이 9 인 항목 (큰 항목)입니다. 두 결과 모두 주어진 요소와 같거나 그보다 큰 것으로 규정됩니다. 그러나 JavaDoc이 최소 요소를 반환한다고 언급 한 이후로 나는 5-7 Entry를 기대합니다.

답변

2

가장 작은 요소가 무엇인지 정의하고 있습니다 (compareTo 정의).

그리고 자신이 그 진술 내용입니다은 :

API가 적어도 요소를 참조 할 때 (천장을 만들다 후 또는 동일

그래서, 그것은 요소를 참조하는 "두 결과는 동등한 자격을")을 의 순서대로 설정으로 설정합니다. 주문 세트를 인쇄하십시오 :

[(1,3), (5,7), (7,9), (9,11), (11,13), (11,13), , 15)]

따라서 천장은 5, null (즉, compareTo이 0을 반환 함)과 같은 요소를 찾은 다음 그 요소를 반환합니다. 당신은 동등한 두 가지 요소를 가지고 있습니다. (그래서 그 후에 그 요소를 찾을 필요가 없습니다).

은 천장 방법 설명서에서 참조하는 것으로, 새로운 비교를 설정하는 것이 아니라 집합의 순서입니다.

그래서 그것은 하나 발견 TreeSet#ceiling(E e) API

를 참조

공공 E 천장 (E e)이

이의 지정된 요소보다 크거나 같은을 설정 한 최소의 요소를 돌려줍니다 5, 7 또는 7,9 (모두 5, null과 같음) 첫 번째로 찾은 값인 7,9 ac 구현에 따라.

실제로 TreeSet은 장면 (doh)의 뒤쪽에있는 Tree 구조이며 두 트리 구조의 노드는 구현 세부 정보 및 삽입 순서에 따라 다릅니다.

compareTo/equals는 일반/권장 규칙을 따르지 않습니다. A와 B가 같고 C와 B가 같으면 A와 C가 같아야합니다. compareTo 함수를 사용하는 경우는 이 아니고이 아닙니다.

+0

그렇다면 내가 대신에 문자열 세트를 사용하면 어떻게 될까요? TreeSet t = new TreeSet (); t.add ("a"); t.add ("b"); t.add ("c");','t.ceiling ("b");'spits out ""b "'? 당신은 "c"가되어야한다고 말하고 있습니다. – siebz0r

+0

죄송합니다 조금 명확하지 않거나 틀렸을 수도 있지만 천장은 *보다 크거나 같음을 반환합니다. TreeSet은 실제로 Tree (배후) 구조입니다 (!), 그 트리의 노드는 두 개의 동일한 노드에 해당합니다. 구현에 따라 달라집니다. –

+0

목록을 사용했다면 분명히 (업데이트 된 답변도 약간 있습니다) 대신'get()'를 사용했다면리스트의 첫 번째 것을 찾는다. –