2014-11-02 186 views
0

我使用线性探测冲突制作散列表。我正在尝试将哈希表的元素添加到Set或集合中。我设置散列表的方式是它是一个包含通用类型K的“关键”和通用类型V的“值”的节点数组。表中没有数组中节点的索引是null,但最初拥有节点但删除的索引用包含新节点(-1,-1)的节点标记。当我打印散列表时,我想避免打印已删除的点(包含键-1的索引)。下面是相关代码:K和int之间不兼容的操作数类型Java

方法添加到组或集合(在哈希表类)

@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; 
    } 

Node类(Hashtable不允许类):

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()方法中得到错误“不兼容的操作数类型K和int”,但在主方法中没有。任何人都可以指出如何克服这一点?

+2

如果你的'hashtable'包含带有字符串的'Node'对象会怎么样? – 2014-11-02 18:26:10

+0

好点,让我试着让删除的节点值成为一个新的节点(null,null)而不是新的节点(-1,-1)。 – 2014-11-02 18:30:12

+1

为什么不删除从表中删除节点? – Radiodef 2014-11-02 18:34:24

回答

2

不要使用-1作为“特殊键值”,因为你的键必须是K类型(K可以是任何东西:字符串,日期等)。

改为使用null。

相关问题