2012-11-03 4 views
1

TreeMap (MyTreeMap)의 구현을 위해 노력 중이며 put 메서드에 많은 문제가 있습니다. 누군가가 내 코드를보고 잘못된 방향으로 올바른 방향으로 나를 가리킬 수 있기를 바랬습니다.TreeMap 구현 메서드를 입력하십시오.

public class MyTreeMap<K extends Comparable<? super K>,V> extends AbstractMap<K,V> { 

K key; 
V value; 
int height; 
MyTreeMap<K,V> left,right; 
int size; 

public V put(K key, V value) { 

    int compareValue = this.key.compareTo(key); 

    if(!this.containsKey(key)) { 
     if(this.key == null) { 
      this.key = key; 
      this.value = value; 
     } 

     if(this.isLeaf() || this.isEmpty()) { 
      if(this.key.compareTo(key) > 0) 
       this.left = new MyTreeMap<K,V>(key,value,null,null); 
      else 
       this.right = new MyTreeMap<K,V>(key,value,null,null); 

      if(left.height > right.height + 1 || right.height > left.height + 1) 
       restructure(this); 
      this.size++; 
      setHeight(); 
      return null; 
     } 
     else { 
      if(compareValue > 0) 
       return this.left.put(key, value); 
      else 
       return this.right.put(key, value); 
     } 
    } 

    else { 
     if(compareValue == 0) { 
      V temp = this.value; 
      this.value = value; 
      return temp; 
     } 

     else if(compareValue < 0) 
      return this.right.put(key, value); 
     else 
      return this.left.put(key, value); 
     } 
} 

답변

0

나는 당신의 논리가 약간 안쪽 아웃 생각, 그 결과가 있어야합니다보다 훨씬 더 복잡하다 : 최상위 레벨 if 아마 containsKey 체크 안하고는 compareValue보고해야한다 .

논리가 있어야한다 : 다음이 당신이 바로 그 열쇠를 발견 한 의미

  • compareValue==0 경우, 그래서 그냥 값을 업데이트하고 (의 기호에 따라
  • 그렇지 않으면 적절한 왼쪽 또는 오른쪽 지점을 확인 반환 compareValue) : 분기가 null
    • 경우, 다음 (당신이 지금 완료)
    • 그렇지 않으면 (분기 null이 아닌)이 브래지어에 반복적으로 넣어 호출 키와 값을 포함하는 새로운 트리 맵 지점으로 바꿀 nch. 당신이 원한다면이 통화 후에 논리를 재조정 할 수 있습니다.

P. TreeMap에 null 키를 허용하지 않는 것이 좋습니다. 키를 null로 검사해야 할 필요가 없습니다.

+0

답장을 보내 주셔서 감사합니다. containsKey 대신 compareValue == 0을 사용하면 정말 도움이되었습니다. 호기심에서 널 키를 어떻게 허용하지 않습니까? – user1547050