2017-05-08 9 views
0

Comparable을 구현하고 Object.equals를 오버라이드하는 정적 중첩 클래스를 만들었습니다. 따라서 e1.compareTo(e2)==0e1.equals(e2)==true은 동의어가 아닙니다.동일 요소 및 트리 집합

그런 다음 add 메서드를 사용하여 각각 TreeSetHashSet에 개체를 추가합니다.

나는 고유성 결정하기 위해 등호에 모두 청구 의존하기 때문에, 성공하는 TreeSet의 또는 HashSet의 하나에 여러 개의 같은 객체의 삽입을 예상하지만 난 HashSet에 삽입하면서 실패합니다 TreeSet에 여러 개의 같은 객체를 삽입 찾을 것입니다 성공. 위의 프로그램의

public class Test { 

    /* 
    * This inner class deliberately has a compareTo method that is not 
    * consistent with equals 
    */ 
    static class TestObject implements Comparable<TestObject> { 
     @Override 
     public int compareTo(TestObject arg0) { 
      // No two of these objects can be ordered 
      return 0; 
     } 

     @Override 
     public boolean equals(Object arg0) { 
      // No two of these objects are ever equal to each other 
      return false; 
     } 
    } 

    public static void printSuccess(boolean success) { 
     if (success) 
      System.out.println(" Success"); 
     else 
      System.out.println(" Failure"); 
    } 

    public static void main(String[] args) { 
     TreeSet<TestObject> testTreeSet = new TreeSet<TestObject>(); 
     HashSet<TestObject> testHashSet = new HashSet<TestObject>(); 

     System.out.println("Adding to the HashSet:"); 
     printSuccess(testHashSet.add(new TestObject())); 
     printSuccess(testHashSet.add(new TestObject())); 
     printSuccess(testHashSet.add(new TestObject())); 

     System.out.println("Copying to the TreeSet:"); 
     for (TestObject to : testHashSet) { 
      printSuccess(testTreeSet.add(to)); 
     } 
    } 
} 

출력 트리 세트는 다음과 같이 행동하는 이유

Adding to the HashSet: 
Success 
Success 
Success 
Copying to the TreeSet: 
Success 
Failure 
Failure 

은 어떤 하나 말해 줄 수 있습니까?

+1

아마도 'hashCode'는 같습니까? 상어 @ – Shark

+0

- 해시 세트는 모든 오브젝트 –

+0

추가된다 (https://docs.oracle.com/javase/7/docs/api/java [A TreeSet의 인스턴스 (또는 비교)은 compareTo 메쏘드를 사용하는 모든 요소 비교를 수행한다] /util/TreeSet.html) –

답변

3

"TreeSet 인스턴스는 compareTo (또는 compare) 메서드를 사용하여 모든 요소 비교를 수행하므로이 메서드로 같은 것으로 간주되는 두 요소는 집합의 관점에서 같음"입니다. https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html 그리고 compareTo가 모두 동등하다고 말합니다.

3

compareTo에 대한 반환 값 0은 개체가 같음을 의미하므로 e1.equals(e2) == true 인 경우에만 e1.compareTo(e2) == 0 인 경우에만 나타납니다.

TreeSet은 oredering을 보장하므로 compare 메소드를 사용하므로 HashSet은 equals 메소드를 사용하지 않습니다. 대신 compareTo 메소드를 양수/음수로 변경하십시오.

Compareable 인터페이스 here에 대한 자세한 내용을 볼 수 있습니다.

+0

TreeSet.add (E e)의 API 문서는, "아직 존재하지 않는 경우는, 지정된 요소를 세트에 추가합니다. 정식 적으로, 지정된 요소 e가 요소 e2를 가지지 않는 경우, 지정된 요소 e를이 세트에 추가합니다 (e = = null? e2 == null : e.equals (e2)). " –

+1

TreeSet doc로부터 : "TreeSet 인스턴스는 compareTo (또는 compare) 메소드를 사용하여 모든 요소 비교를 수행하므로이 메소드에 의해 동등한 것으로 간주되는 두 요소는 집합의 관점에서 같음"입니다. 프로그래머가 Compareable의 계약을 유지할 것을 신뢰하기 때문에 equals는 compareTo와 동일한 결과를 낳습니다. – afifit

0

는 또한 javadoc of java.util.Comparator 명시 적으로 이러한 경우를 설명하고 SortedSet위한 Comparatorequals와 일치해야한다는 것을 말한다 : 예를 들면

, 가정 한 두 요소 A 및 B되도록 (a.equals 추가 (b) & & c.compare (a, b)! = 0)을 비교자인 빈 TreeSet에 비교합니다. c. a와 b가 트리 세트의 관점에서 동일하지 않기 때문에 이것은 Set.add 방법의 사양에 반하는 경우에도, 두 번째 추가 작업이 true를 돌려줍니다 (그리고 트리 세트의 크기 은 증가 할 것이다).