我正在阅读java中的地图。我做了这个代码。
public class Test {
private HashMap<String, Integer> h;
private int dataCount;
public Test() {
h = new HashMap<String, Integer>();
dataCount = 0;
}
public String getNumber(String name) {
for (String k : h.keySet()) {
if (k.equals(name)) {
Integer v = h.get(k);
return k+" "+v;
}
}
return null;
}
public void putNumber(String name, Integer number) {
Iterator<String> i = h.keySet().iterator();
if (i.equals(name)) {
h.put(name, number);
}
h.put(name, number);
dataCount++;
}
// public void putNumber(String name, Integer number) {
//
// for (String k : h.keySet()) {
// if(k.equals(name)) {
// h.put(k, number);
// }
// h.put(name, number);
// dataCount++;
// }
// }
public static void main(String[] args) {
Test t = new Test();
t.putNumber("ali", 123);
t.putNumber("ala", 658);
t.putNumber("baba", 987);
t.putNumber("ali", 666);
System.out.println(t.dataCount);
System.out.println(t.getNumber("ali"));
System.out.println(t.h);
}
}
当我运行此代码时,我得到:
4
ali 666
{baba=987, ala=658, ali=666}
不应该那样,我希望它是这样的:
3
{ali 666, baba=987, ala=658}
在我的putNumber方法中,当地图中的名称已经存在时,我只想更改其编号,而不是使用新编号再次添加相同的名称。
我还有我的第二个putNumber方法,每个循环都没有nork。当我用putNumber方法运行代码时(对于每一个),我得到了这个:
0
null
{}
由于
答案 0 :(得分:4)
您的putNumber
方法包含多个错误:
i.equals(name)
您要将String
与Iterator<String>
进行比较。这不会起作用h.put
两次(这不是问题,但显然没用)dataCount++
(当它应该是唯一的条件时)以下是我要做的事情:
public void putNumber(String name, Integer number) {
if (!h.containsKey(name)) {
dataCount++;
}
h.put(name, number);
}
或者,使用HashTable
(其中null
不是授权值)而不是HashMap
,可以依赖HashTable.put(key, value)
的返回值如果null
key
public void putNumber(String name, Integer number) {
if (h.put(name, number) == null) {
dataCount++;
}
}
另请注意,HashMap
类定义了一种.size()
方法,可能会使dataCount
变量无法使用。
答案 1 :(得分:2)
我认为您的putNumber
方法错误,应该是
public void putNumber(String name, Integer number) {
Iterator<String> i = h.keySet().iterator();
if (i.equals(name)) {
h.put(name, number);
} else {
h.put(name, number);
dataCount++;
}
}
现在,如果密钥已经存在,它仍会增加dataCount
。
但是,此代码存在另一个问题。使用HashMap
的一个主要优点是你可以非常快速地查找键;您不需要迭代密钥集,您可以使用h.containsKey(name)
和h.get(name)
。此外,它还有一个内置的size()方法,其属性与dataCount
相同。
答案 2 :(得分:2)
您没有正确使用HashMap
。
迭代keySet
以找到特定密钥没有意义。这是get
,put
和containsKey
的用途。
public void putNumber(String name, Integer number) {
if (h.put(name, number) == null)
dataCount++; // increment the counter only if the name was not already in the Map
}
public String getNumber(String name) {
Integer v = h.get(name);
return v == null ? null : name+" "+v;
}
答案 3 :(得分:2)
public void putNumber(String name, Integer number) {
Iterator<String> i = h.keySet().iterator();
if (i.equals(name)) {
h.put(name, number);
}
h.put(name, number);
dataCount++;
}
1)在任何情况下,您都将元素放在地图中。所以你不应该重复自己
2)除此之外,即使没有添加新值,dataCount也会逐渐递增
3)if (i.equals(name))
不比较所有键,而是将迭代器值与name参数进行比较。
试试:
public void putNumber(String name, Integer number) {
if (!h.containsKey(name)){
dataCount++;
}
h.put(name, number);
}
此外,getNumber()也可以简化,因为再次使用map的containsKey()方法。
public String getNumber(String name) {
if (h.containsKey(name)){
Integer v = h.get(k);
return k+" "+v;
}
return null;
}
答案 4 :(得分:0)
你的putNumber方法没什么意义:
public void putNumber(String name, Integer number) {
Iterator<String> i = h.keySet().iterator(); //i is an iterator
//this returns always false, you are comparing an iterator to a string
if (i.equals(name)) {
h.put(name, number);
}
//this code is always executed
h.put(name, number);
dataCount++;
}
你应该做的是:
public void putNumber(String name, Integer n) {
h.put(name,n);
dataCount=h.size();
}
或者,如果你想要更多“手动”的东西:
public void putNumber(String name, Integer n) {
if (h.get(name)==null) {
dataCount++;
}
h.put(name,n);
}