【问题标题】:Incompatible operand types between K and int JavaK 和 int Java 之间不兼容的操作数类型
【发布时间】:2014-11-02 18:22:09
【问题描述】:

我正在制作一个带有线性探测冲突的哈希表。我正在尝试将哈希表的元素添加到集合或集合中。我设置哈希表的方式是它是一个节点数组,其中包含泛型 K 的“键”和泛型 V 的“值”。表中没有数组中的节点的索引是null,但最初有一个节点但被删除的索引被标记为一个包含新节点(-1,-1)的节点。当我去打印哈希表时,我想避免打印已删除的点(包含键 -1 的索引)。以下是相关代码:

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

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

节点类(不是哈希表类):

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”,但在 main 方法中没有。谁能指出如何克服这个问题?

【问题讨论】:

  • 如果您的hashtable 包含带有字符串的Node 对象怎么办?
  • 好点,让我尝试将删除的节点值设为新节点(null,null)而不是新节点(-1,-1)。
  • Node被删除时,为什么不直接从表中删除它?

标签: java


【解决方案1】:

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

改用 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多