2014-11-02 2 views
0

선형 프로빙 충돌로 해시 테이블을 만들고 있습니다. 해시 테이블의 요소를 Set 또는 Collection에 추가하려고합니다. 내 해시 테이블을 설정 한 방식은 제네릭 형식 K의 "키"와 제네릭 형식 V의 "값"을 포함하는 노드 배열입니다. 배열의 노드가없는 테이블의 인덱스는 다음과 같습니다. null이지만 원래는 노드가 있었지만 삭제 된 인덱스는 새 노드 (-1, -1)가 포함 된 노드로 표시됩니다. 해시 테이블을 인쇄 할 때 삭제 된 부분 (키 -1이 들어있는 인덱스)을 인쇄하지 않으려합니다.K와 int 사이의 피연산자 유형이 호환되지 않습니다.

방법은 세트 또는 컬렉션에 추가합니다 (해시 테이블 클래스)

@Override 
    public Set<K> keySet() { 
     Set<K> s = new HashSet<K>(); 
     for(int i=0; i<this.hashtable.length; i++) { 
      if(this.hashtable[i] != null && this.hashtable[i].key != -1) 
       s.add(this.hashtable[i].key); 
     } 
     return s; 
    } 

    @Override 
    public Collection<V> values() { 
     LinkedList<V> l = new LinkedList<V>(); 
     for(int i=0; i<this.hashtable.length; i++) { 
      if(this.hashtable[i] != null && this.hashtable[i].key != -1) 
       l.add(this.hashtable[i].val); 
     } 
     return l; 
    } 

노드 클래스 (해시 테이블에 NOT 클래스) : 실제 내

private final class Node<K extends Comparable<? super K>, V> { 
     public K key; 
     public V val; 

     public Node() { 
      this.key = null; 
      this.val = null; 
     } 

     public Node(K theKey, V theValue) { 
      this.key = theKey; 
      this.val = theValue; 
     } 
    } 

홈페이지 방법 다음은 관련 코드입니다 해시 테이블 클래스 :

public static void main(String[] args) { 
     MyJHUHashMap<Integer, String> m = new MyJHUHashMap<>(); 
     m.put(1, "1!"); 
     m.put(2, "2!"); 
     m.put(3, "3!"); 
     m.put(4, "4!"); 
     m.put(5, "5!"); 
     m.put(6, "6!"); 
     m.put(7, "7!"); 
     m.put(8, "8!"); 
     m.put(9, "9!"); 
     m.put(10, "10!"); 
     m.put(11, "11!"); 
     m.put(12, "12!"); 
     m.put(13, "6!"); 
     m.put(14, "7!"); 
     m.put(15, "8!"); 
     m.put(16, "9!"); 
     m.put(17, "10!"); 
     m.put(18, "11!"); 
     m.put(19, "12!"); 
     m.put(20, "10!"); 
     m.put(21, "11!"); 
     m.put(22, "12!"); 
     m.put(23, "23!"); 
     System.out.println(m.get(4)); 
     System.out.println(m.get(12)); 
     System.out.println(m.get(25)); 
     System.out.println(m.containsKey(22)); 
     System.out.println(m.containsKey(35)); 
     m.remove(23); 
     m.remove(18); 
     //m.put(7, 7); 
     System.out.println(m.hashtable.length); 
     System.out.println(m.size()); 
     for(int i=0; i<m.hashtable.length; i++) { 
      if(m.hashtable[i] != null && m.hashtable[i].key != -1) 
       System.out.print(m.hashtable[i].key + " "); 
     } 
    } 

길이가 정확하고 크기가 정확하며 키 그러나 인쇄 할 때는 -1 값이 포함됩니다. 이를 극복하기 위해이 메소드에 "this.hashtable [i] .key! = -1"을 썼다. 그러나 keySet() 및 values ​​() 메서드에서는 "Incompatible operand types K and int"오류가 발생하지만 main 메서드에서는 오류가 발생합니다. 아무도 이것을 극복 할 수있는 방법을 지적 할 수 있습니까?

+2

'hashtable'에 문자열이있는'Node' 객체가 있으면 어떻게 될까요? –

+0

좋은 점은 삭제 된 노드 값을 새 노드 (-1, -1) 대신 새 노드 (null, null)로 만들도록하겠습니다. –

+1

테이블이 삭제되었을 때'Node'를 테이블에서 제거하지 않으시겠습니까? – Radiodef

답변

2

키가 K 유형 (K는 문자열, 날짜 등일 수 있음)이므로 -1을 "특수 키 값"으로 사용하지 마십시오.

null을 대신 사용하십시오.

관련 문제