在hashmap中实现put方法

时间:2017-01-03 14:47:54

标签: java

我正在阅读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
{}

由于

5 个答案:

答案 0 :(得分:4)

您的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

之前没有映射,则会返回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以找到特定密钥没有意义。这是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;
}

答案 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);
}