K和int之间不兼容的操作数类型Java
问题描述:
我使用线性探测冲突制作散列表。我正在尝试将哈希表的元素添加到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”,但在主方法中没有。任何人都可以指出如何克服这一点?
答
不要使用-1作为“特殊键值”,因为你的键必须是K类型(K可以是任何东西:字符串,日期等)。
改为使用null。
如果你的'hashtable'包含带有字符串的'Node'对象会怎么样? – 2014-11-02 18:26:10
好点,让我试着让删除的节点值成为一个新的节点(null,null)而不是新的节点(-1,-1)。 – 2014-11-02 18:30:12
为什么不删除从表中删除节点? – Radiodef 2014-11-02 18:34:24