[英]implementation of put method in a hashmap
我正在閱讀有關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方法與for每個循環根本不規范。 當我使用putNumber方法運行代碼時(針對每個方法),我得到以下信息:
0
null
{}
謝謝
您的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
如果該映射沒有先前的映射,則將返回null
。 key
:
public void putNumber(String name, Integer number) {
if (h.put(name, number) == null) {
dataCount++;
}
}
還要注意, HashMap
類定義了.size()
方法,這可能會使維護dataCount
變量無用。
我認為您的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
相同的屬性。
您沒有正確使用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;
}
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);
}
此外,由於還多使用了地圖的containsKey()方法,因此getNumber()也可以得到簡化。
public String getNumber(String name) {
if (h.containsKey(name)){
Integer v = h.get(k);
return k+" "+v;
}
return null;
}
您的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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.