【问题标题】:HashMap containsKey always returns false for same stringHashMap containsKey 对于相同的字符串总是返回 false
【发布时间】:2018-05-01 15:06:23
【问题描述】:

我正在从一个文件中解析,其中我有这种格式的城市名称和到其他城市的距离:

"San Antonio" 
"San Francisco" 
Washington 

"San Francisco"--Weed [305]
"San Francisco"--"Wisconsin Dells" [2189]
Washington--"San Jose" [2909]

我认为问题在于,当我分割字符串时,它会创建不同的对象,并且由于某种原因,String.equals 和/或 hashcode() 会给出不同的结果。因此, Map.get(key) 返回空值。但是我不知道如何解决这个问题。

public class spanning {
private static HashMap<String, HashMap<String, Integer>> map = new HashMap<String, HashMap<String, Integer>>();
public static void main(String[] args) throws IOException {
    BufferedReader read = new BufferedReader(new FileReader(args[0]));
    String temp;
    while ((temp = read.readLine()) != null) {
        if (temp.contains("[")) {
            String[] parts = temp.split("--");
            String[] parts2 = parts[1].split(" \\[");
            Scanner scan;
            scan = new Scanner(parts2[1]).useDelimiter("\\D");
            int o = scan.nextInt();
            map.get(parts[0]).put(parts2[0], o);
        } else {
            map.put(temp, new HashMap<String, Integer>());

        }
    }
    System.out.println("Finished!");
}

}

【问题讨论】:

  • String.equals() 将比较字符串情况下的文本。你有什么失败的例子吗?
  • 是的,我在 map.get() 上方添加了一行 boolean test = map.containsKey(parts[0]) 并返回 false
  • 如果打印parts[0]和地图中的键,parts[0]是否存在于其中?
  • 您将整个 temp 作为键放入哈希图中,而不是 parts[0]- 您是故意这样做的吗?在那个else - 在你放入之前检查temp 的样子
  • 如果temp 不包含距离,则它只是在地图中以““San Antonio”或“Washington”的形式出现。打算试试@notyou 现在说的。

标签: java string object hashmap containskey


【解决方案1】:

我已经运行了您的代码,下面是到达打印“已完成”的行时的地图:

map = {HashMap@634}  size = 4
 0 = {HashMap$Node@640} "" -> " size = 0"
 1 = {HashMap$Node@641} ""San Antonio"" -> " size = 0"
  key = ""San Antonio""
  value = {HashMap@647}  size = 0
 2 = {HashMap$Node@642} ""San Francisco"" -> " size = 2"
  key = ""San Francisco""
  value = {HashMap@649}  size = 2
   0 = {HashMap$Node@654} "Weed" -> "305"
   1 = {HashMap$Node@655} ""Wisconsin Dells"" -> "2189"
 3 = {HashMap$Node@643} "Washington" -> " size = 1"
  key = "Washington"
  value = {HashMap@651}  size = 1
   0 = {HashMap$Node@662} ""San Jose"" -> "2909"

具体的问题是什么?您是否在地图退出方法之前看到了地图的值?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2016-12-18
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多