簡體   English   中英

哈希圖中put方法的實現

[英]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)您正在將StringIterator<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如果該映射沒有先前的映射,則將返回nullkey

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以定位特定鍵沒有意義。 這就是getputcontainsKey的用途。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM