Hashmap, the values are null


import java.util.*;
public class MyHashMap<K,V> extends HashMap<K,V> {
    public MyHashMap(K[] keys, V[] values) {
        super();
        // Store the <key,value> pairs to the HashMap object
        HashMap<String,Integer> map = new HashMap<String,Integer>();
        map.put("Hydrogen",1);
        map.put("Lithium",3);
        map.put("Sodium",11);
        map.put("Potassium",19);
        map.put("Rubidium",37);
    }
    public String toString() {
        return "Done";
    }
    public static void main(String[] args) {
        //Two Arrays
        String[] elements ={"Hydrogen","Lithium","Sodium","Potassium","Rubidium"};
        Integer[] atomicNumbers = {1,3,11,19,37};
        MyHashMap<String,Integer> map = new MyHashMap<String,Integer>   (elements,atomicNumbers);    
        for (int i=0; i<elements.length; i++) {
            System.out.println("The atomic number of " + elements[i] + " is "+          map.get(elements[i]));
        }
        System.out.println(map.toString());
    }
}

输出是错误的(氢的原子序数是null),我不确定是否有什么是错误的,当我把键和值或其他错误在我的代码。请帮助!

请记住,MyHashMap 一个Map,但是您仍然需要填充这些值。这是通过使用您在main中声明的数组来完成的。

如果数组的大小是关闭的(或者数组是null),你不想创建这个对象;我将后者留给用户作为练习。

public MyHashMap(K[] keys, V[] values) {
    super();
    if (keys.length != values.length) {
        throw new IllegalArgumentException("Array lengths are not equivalent!");
    }
    // Store the <key,value> pairs to the HashMap object
    for (int i = 0; i < keys.length; i++) {
        put(keys[i], values[i]);
    }
}

您将条目存储在map对象中,该对象的作用域仅限于MyHashMap构造函数

试试这个:

public MyHashMap(K[] keys, V[] values) {
    if (keys.length == values.length) {
        for (int i = 0; i < keys.length; i++) {
            this.put(keys[i], values[i]);
        }
    }
}

两个主要问题:

  1. 在你的构造函数中,你把东西存储在一个你不保留的本地映射中。您的映射,即MyHashMap实例,没有任何内容。

    从构造函数中删除map变量,使用this代替,例如:

     this.put(...);
    

  2. 其次,您没有使用在构造函数中传递给构造函数的keysvalues。您只是在构造函数本身中使用了一系列硬编码语句。因此,这在逻辑上没有意义,也不会编译,因为不能保证(在那个阶段)this.put可以应用于String, Integer(即使您稍后会这样做)。如果您使用keysvalues中的值,但是,因为它们的类型是KV,它将工作。

。,修复两者,删除构造函数中的一系列硬编码行(以及map),并在keysvalues上使用循环:

if (keys.length != values.length) {
    // Throw an exception or similar
}
for (int i = 0; i < keys.length; ++i) {
    this.put(keys[i], values[i]);
}

最新更新