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]);
}
}
}
两个主要问题:
-
在你的构造函数中,你把东西存储在一个你不保留的本地映射中。您的映射,即
MyHashMap
实例,没有任何内容。从构造函数中删除
map
变量,使用this
代替,例如:this.put(...);
-
其次,您没有使用在构造函数中传递给构造函数的
keys
和values
。您只是在构造函数本身中使用了一系列硬编码语句。因此,这在逻辑上没有意义,也不会编译,因为不能保证(在那个阶段)this.put
可以应用于String, Integer
(即使您稍后会这样做)。如果您使用keys
和values
中的值,但是,因为它们的类型是K
和V
,它将工作。
。,修复两者,删除构造函数中的一系列硬编码行(以及map
),并在keys
和values
上使用循环:
if (keys.length != values.length) {
// Throw an exception or similar
}
for (int i = 0; i < keys.length; ++i) {
this.put(keys[i], values[i]);
}