0

我的 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、开始、结束、奇偶

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

我有类似的东西:

  • 贾斯特街
  • 另一条街
  • 另一条街
  • 贾斯特街
  • 贾斯特街

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

我的问题是:在 HashMap 中有重复的键怎么可能是真实的?我做错了什么。

UPD:密钥是唯一的。在另一个班级发现问题。

4

1 回答 1

3

在 HashMap 中有一个重复的键怎么可能是真实的?我做错了什么。

很可能字符串不完全相同。例如AStreetAStreet{space}看起来相同,但事实并非如此。更糟糕的是,有些字符没有宽度;)

我建议您打印Array.toString(text.getBytes())每个键以查看它们包含哪些字节。


如果在将密钥添加到地图后修改密钥,您可以获得重复的密钥(您无法获得)。如果添加后密钥的哈希码发生更改,则它可能位于错误的位置。这将在您迭代时出现,但不会被视为要在 put 上替换的值,并且您不会在 get 上找到它。

简而言之,您应该注意不要更改 hashcode、equals 或 compareTo 中的任何字段使用。

于 2012-12-22T11:08:17.620 回答