HashMap中的重复键

时间:2012-12-22 10:27:37

标签: java hashmap keyset

我的HashMaps出现了奇怪的情况。在迭代HashMap的keySet()时,我得到了重复的值。在尝试获取值时,我得到了NULL。

这是我的HashMap实现:

    import java.util.ArrayList;
    import java.util.HashMap;

    public class StreetsMap extends HashMap<String, ArrayList<String[]>> {
        public void put(String key, String[] data) {
            ArrayList<String[]> current = get(key);
            if (current == null) {
                current = new ArrayList<String[]>();
                super.put(key, current);
            }
            current.add(data);
        }
    }

从CSV文件中读取行时,我正在用值填充HashMap 我在CSV中有这样的东西(原始列表更长):

Location_Code,Street_Name,Start,End,OddEven

01001, JustAStreet ST, 1, 11, odd
01001, JustAStreet ST, 17, 47, odd
... more of this
01001, JustAStreet ST, 2, 30, even
01001, JustAStreet ST, 40, 80, even
01001, AnotherStreet ST, 3, 27, odd
01001, AnotherStreet ST, 9, 51, odd
... and even more
01001, AnotherStreet ST, 0, 50, even
01001, AnotherStreet ST, 2, 14, even
01001, AnotherStreet ST, 0, 100, even

我用逗号分割一行,修剪值并用数据填充HashMap:

    String[] lines = inputText.split("\n");

    StreetsMap streetsData = new StreetsMap(); // 

    for (String line : lines) {
        String[] newLine = line.split(",");

        String[] streetData = new String[4];

        streetData[0] = newLine[0].trim();  // Location code
        streetData[1] = newLine[2].trim();  // Start
        streetData[2] = newLine[3].trim();  // End
        streetData[3] = newLine[4].trim();  // OddEven

        streetsData.put(newLine[1].trim(), streetData);

问题就在这里开始。如果我遍历keySet():

    for (String name : streetsData.keySet()) {
        System.out.println(name);
    }

我有类似的东西:

  • JustAStreet
  • AnotherStreet
  • AnotherStreet
  • JustAStreet
  • JustAStreet

当我尝试使用.get(key)方法在迭代过程中通过HashMap访问数据时,有时我会得到null。所以我失去了价值观。 :(

我的问题是:在HashMap中如何真正拥有重复的密钥?我做错了什么。

UPD:密钥是唯一的。在另一堂课中发现了这个问题。

1 个答案:

答案 0 :(得分:3)

  

在HashMap中如何真正拥有重复的密钥?我做错了什么。

很可能弦乐不完全一样。例如,AStreetAStreet{space}看起来相同但不是。更糟糕的是,有些字符没有宽度;)

我建议您为每个键打印Array.toString(text.getBytes())以查看它们中的字节数。


如果在将密钥添加到地图后修改密钥,则可以获得重复密钥(无法获取)。如果密钥的哈希码在添加后发生变化,则可能位于错误的位置。当你进行迭代时会出现这种情况,但不会被视为一个替换在一个看跌期权的值而你不会在一个得到它时找到它。

总之,你应该注意不要改变hashcode,equals或compareTo中的任何字段用法。