它在HashMap

时间:2016-10-07 13:33:43

标签: java dictionary null hashmap

我是Java的新手(来自Adobe LiveCycle上的JavaScript开发)并面临以下问题:

我有一个包含多个项目的String数组。我想只放置值为" a"到HashMap。但不是3" a" HashMap中的值我得到1个空值。这是为什么?

    String[] s = {"a", "a", "b", "a"};

    Map m = new HashMap();

    for (int i = 0; i < s.length; i++) {
        if (s[i].equals("a")) {
            m.put(i, s[i]);
        }
    }

    for (int i = 0; i < m.size(); i++) {
        System.out.println(m.get(i));
    }

    // Prints
    //a
    //a
    //null

3 个答案:

答案 0 :(得分:2)

您正在使用键013将项目放入地图中。

您正在使用密钥012将其删除。

使用:

    for (Object o : m.keySet()) {
        System.out.println(m.get(o));
    }

或 - 更好:

    Map<Integer, String> m = new HashMap<>();

    ...

    for (Integer i : m.keySet()) {
        System.out.println(i + " -> " + m.get(i));
    }

答案 1 :(得分:1)

您将具有相应索引的项目放在s的数组Map中,即您拥有内容为Map的{​​{1}}。因此,如果您尝试使用密钥{0=a, 1=a, 3=a}2)访问地图,则会收到m.get(2),因为null中找不到密钥2

我建议不要使用m - 循环超过for的大小,而是建议通过{{m keySet()进行迭代3}}:

m

旁注:您正在使用foreach-loop。您应该正确绑定for (Object key : m.keySet()) { System.out.println("key: " + key + ", value: " + m.get(key)); } Map的类型(有关详细信息,请参阅raw types):HashMap。使用正确绑定的类型,Map<Integer, String> m = new HashMap<Integer, String>(); - 循环中的key可以是forint类型。我建议输入Integer以避免不必要的Javadoc of Map

答案 2 :(得分:1)

您的代码工作正常,但您没有正确访问它。

String[] s = {"a", "a", "b", "a"};
for (int i = 0; i < s.length; i++) {
    if (s[i].equals("a")) {
        m.put(i, s[i]);
    }
}

这就像这样

First iteration : m.put(0, "a");
Second iteration : m.put(1, "a");
Third iteration : "b" doest not equal "a" but still counts the index i up
Fourth iteration: m.put(3, "a");

除了其他答案,您仍然可以使用基于范围的循环并使用Iterator

访问它
Iterator<String> it = m.values().iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }