2012-06-13 2 views
6

TreeSet에 대한 javadocs에서 '이 클래스는 TreeMap 인스턴스에 의해 지원되는 Set 인터페이스를 구현합니다.'라는 것이 무엇을 의미하는지 알고 싶습니다. 아래 예에서 Hashcode 메소드를 구현하지 않았지만 여전히 예상대로 작동하고 있습니다. 즉 객체를 정렬 할 수 있습니다. TreeSet 동작을 검사하기 위해 일관되게 Equals 구현을 구현하지 않았습니다. 그것이 compareTo 메소드와 해시에 기초하여 소팅된다 .SOTreeSet은 내부적으로 TreeMap을 사용하므로 Treeset을 사용할 때 Hashcode 메소드를 구현해야합니다.

import java.util.TreeSet; 


public class ComparisonLogic implements Comparable<ComparisonLogic>{ 

String field1; 
String field2; 

public String toString(){ 
    return field1+" "+field2; 
} 

ComparisonLogic(String field1,String field2){ 
    this.field1= field1; 
    this.field2= field2; 

} 
public boolean equal(Object arg0){ 
    ComparisonLogic obj = (ComparisonLogic) arg0; 

    if(this.field1.equals(obj.field1)) 
     return true; 
    else 
     return false; 
} 

public int compareTo(ComparisonLogic arg0){ 
    ComparisonLogic obj = (ComparisonLogic) arg0; 
    return this.field2.compareToIgnoreCase(obj.field2); 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    ComparisonLogic x = new ComparisonLogic("Tom", "jon"); 
    ComparisonLogic y = new ComparisonLogic("Tom", "Ben"); 
    ComparisonLogic z = new ComparisonLogic("Tom", "Wik"); 

    TreeSet<ComparisonLogic> set = new TreeSet<ComparisonLogic>(); 
    set.add(x); 
    set.add(y); 
    set.add(z); 
    System.out.println(set); 
} 

} 

이 예 인쇄 [톰 벤 톰 존 톰 WIK() 메소드는이 scenario.However에 사소한 것처럼 보이지만 TreeSet의은 트리 맵에 연동, 그래서 내부적으로 TreeMap이 정렬에 사용되면, treeMap이 객체를 해싱하는 방법은 무엇입니까?

답변

0

귀하의 ComparisonObjectObject에 정의 된 hashCode 방법을 사용하고 있습니다. 두 개의 필드에 대해 동일한 값을 사용하여 다른 ComparisonLogic의 숫자를 추가하고 결과를 확인하십시오.

+0

추가 정보를 제공하기 위해 질문을 편집했습니다. – Metalhead

+0

더 이상의 정보는 필요 없습니다 - 제가 제안한 것을 시도해보십시오. 그리고 여러분은 제가 의미하는 것을보실 수 있습니다! – Russell

+0

내가 망 쳤어. 내 equals 메서드 구문이 올바르지 않습니다. equal() :()을 사용했습니다. – Metalhead

6

나는 두 가지 질문을하고 있다고 생각합니다.

1, 왜 코드가 작동합니까?

는 해시 코드() 메소드를 오버라이드 (override)하지 않는, 클래스가 상속마다 별개의 해시 코드를 객체주는 기본 해시 코드() 객체에서있어서, Avi으로

this 주제에 썼다 . 이것은 t1과 t2가 서로 다른 두 개의 해시 코드를 가지고 있음을 의미합니다. 비교해도 동일 할 것입니다. 특정 해시 맵 구현에 따라 맵은이 별도로 저장되는 입니다.

즉, 별도로 저장할 필요는 없지만 가능할 수 있습니다. 이 코드를보십시오 :

TreeSet<ComparisonLogic> set = new TreeSet<ComparisonLogic>(); 
    set.add(new ComparisonLogic("A", "A")); 
    set.add(new ComparisonLogic("A", "B")); 
    set.add(new ComparisonLogic("A", "C")); 
    set.add(new ComparisonLogic("B", "A")); 
    set.add(new ComparisonLogic("B", "B")); 
    set.add(new ComparisonLogic("B", "C")); 
    set.add(new ComparisonLogic("C", "A")); 
    set.add(new ComparisonLogic("C", "B")); 
    set.add(new ComparisonLogic("C", "C")); 
    set.add(new ComparisonLogic("A", "A")); 

    System.out.println(set.remove(new ComparisonLogic("A", "A"))); 
    System.out.println(set.remove(new ComparisonLogic("A", "B"))); 
    System.out.println(set.remove(new ComparisonLogic("A", "C"))); 
    System.out.println(set.remove(new ComparisonLogic("B", "A"))); 
    System.out.println(set.remove(new ComparisonLogic("B", "B"))); 
    System.out.println(set.remove(new ComparisonLogic("B", "C"))); 
    System.out.println(set.remove(new ComparisonLogic("C", "A"))); 
    System.out.println(set.remove(new ComparisonLogic("C", "B"))); 
    System.out.println(set.remove(new ComparisonLogic("C", "C"))); 

나를 위해 출력은 다음이었다 그들 중 일부를 의미

true 
true 
true 
false 
false 
false 
false 
false 
false 

그들이 어떤을하지 않았다.

2 Treeset 용 javadocs에서 '이 클래스는 TreeMap 인스턴스에 의해 뒷받침되는 Set 인터페이스를 구현합니다.'라고 할 때 무엇을 의미합니까?

자바 1.7의 TreeSet의 클래스처럼 보이는 것을 의미 다음

public class TreeSet<E> extends AbstractSet<E> 
implements NavigableSet<E>, Cloneable, java.io.Serializable 
{ 
/** 
* The backing map. 
*/ 
private transient NavigableMap<E,Object> m; 

TreeSet(NavigableMap<E,Object> m) { 
    this.m = m; 
} 

... (lots of other code)  

public boolean contains(Object o) { 
    return m.containsKey(o); 
} 

etc. 

이는 TreeSet의 클래스 아래지도가 있음을 의미 만에 위임 방법이 많이있다 .

도와 드리겠습니다.

public boolean add(E e) { 
    return m.put(e, PRESENT)==null; 
} 

지금 넣어있어서 내부적 :

0

는 TreeSet의 내부 호

set.add(x); 

내부적 트리 맵의 PUT 메소드 호출을 의미 트리 맵 오브젝트 키 - 값 쌍으로서 저장 개체 'm'을 사용 호출은 Comparator가 제공되는지 비교하거나 케이스에 ComparisonLogic 클래스 "compareTo"메소드를 사용합니다.

Comparator를 구현하는 동안 제공되는 compareTo (Object o1) 또는 Comparator를 구현하는 동안 제공되는 compare (Object o1, object o2) 메서드를 대신 사용하여 equals 또는 hashcode를 절대 사용하지 않습니다.

질문에 대답하기 위해 비교 (compare 또는 compareTo) 메소드 구현에서 hashcode() 메소드를 사용하지 않는 한 hashcode() 메소드를 구현할 필요가 없습니다.

0

TreeSet가 내부적으로 TreeMap을 사용한다는 것은 사실입니다. TreeMap에는, 열쇠 오브젝트에 대해서 구현 된 hashCode 및 equals 메소드가있을 필요는 없습니다. TreeMap은 자체 적으로 이진 검색 트리 인 Red-Black 트리를 내부적으로 사용합니다. 이 트리의 순서는, compareTo 메소드 (Comparable 인터페이스를 구현하는 키 오브젝트) 또는 compare 메소드 (제공된 Comparator는 TreeMap의 작성 중에 정의됩니다.이 경우는 실제로 TreeSet가 사용됩니다)를 사용해 유지됩니다. 희망이 사라집니다.