java - HashMap 中的重复键

标签 java hashmap keyset

我的 HashMap 遇到了奇怪的情况。在迭代 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 中有类似的内容(原始列表更长):

位置代码、街道名称、起点、终点、奇偶数

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
  • 另一条街
  • 另一条街
  • JustAStreet
  • JustAStreet

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

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

UPD: key 是唯一的。在另一个类(class)发现了这个问题。

最佳答案

how can it be real having a duplicated key in a HashMap? What I'm doing wrong.

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

我建议您打印Array.toString(text.getBytes())对于每个键,查看它们中有哪些字节。

<小时/>

如果在将 key 添加到 map 后对其进行修改,则可能会获得重复的 key (这是您无法获得的)。如果某个键的哈希码在添加后发生变化,则该键可能位于错误的位置。当您进行迭代时,它会出现,但不会被视为要在 put 上替换的值,并且您不会在 get 上找到它。

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

关于java - HashMap 中的重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002027/

相关文章:

java - HashMap.keySet() 如何返回键的 View ?

c++ - 通过映射键集查找算法 (c++)

java - 为什么重新启动具有限制 UserManager.DISALLOW_USB_FILE_TRANSFER 使用的应用程序的设备会导致该设备无法使用?

java - 具有比较器实现的Java PriorityQueue不会返回字符串的相反顺序

java hashmap覆盖值

Java HashMap 返回值不符合我对 equals 和 hashcode 的理解

java - 至少 24 小时后的 hibernate validator 注释

java - 在java中替换文本文件的内容

java - 在 Java 中通过 Maps.newHashMapWithExpectedSize(...) 限制 Map 的大小会导致冲突

java - java中的HashMap函数keyset()