【问题标题】:Hashmap fails to fetch the value for my keyHashmap 无法获取我的键的值
【发布时间】:2013-12-03 13:33:29
【问题描述】:

我有一个如下格式的文本文件

module1.q1=a1
module1.q2=a2
module2.q1=a1
module2.q5=a6
..
..

我有一个类 objectsHmp,它有两个字符串变量来存储问题(q1、q2、q3、...)和答案(a1、a2、a3、..)。我想要做的是保持模块ID作为键,我想用值作为对象的arraylist(objectsHmp)填充一个hashmap。反过来,我将键存储在字符串的数组列表中。

在下面的代码sn-p中,

*l_ext_keys* 是一个存储键的字符串数组列表, *l_extract* 是 HashMap>,
*l_temp_array* 是对象 objectsHmp 的数组列表,

while((line=br.readLine()) != null)
{        
  String[] ss = new String[2];
  ss = line.split("=");


  String tss = ss[0];
  String[] kss = tss.split("\\.");   

  objectsHmp temp = new objectsHmp(kss[1],ss[1]);
  if(!prev.equals(kss[0]))
  {
      l_ext_keys.add(prev);      
      l_extract.put(prev,l_temp_array);      
      l_temp_array.clear();
   }
   l_temp_array.add(temp);
   prev = kss[0];   
}

       l_extract.put(prev,l_temp_array);
       l_ext_keys.add(prev);        
       l_temp_array.clear();

问题

Hashmap 正在填充,但它没有 l_ext_keys 中存在的某些键的值。我尝试打印arraylist和hasmap的长度,但它有很大的不同(arraylist的键值比hashmap多)。

造成这种差异的一个可能原因是某些模块重复了。 我会覆盖任何功能

问题 hashmap 无法获取列表中存在的键的值的可能性有哪些?还是我在这里犯了大错?

【问题讨论】:

  • 还有未解决的问题吗?因为你还没有接受任何答案。如果还有问题,请随时提问!
  • @Ben,我通过更改整个逻辑来修复它。我怀疑模块名称中有一些重复。

标签: java arraylist hashmap


【解决方案1】:

HashMap 中不能有多个密钥。键必须是唯一的。所以你现在就用你的方法覆盖旧密钥。

您可以将 HashMap 用作目录,将一个键的所有值保存在 Array 或 ArrayList 中,然后定义:

HashMap<String, ArrayList<String>> directory = new HashMap<String, ArrayList<String>>();

之后,您可以使用键 q1 检索包含 q1 值的 ArrayList

编辑: 您的代码缺少一些信息,但据我所知,您将 module1 等作为您的哈希图中的键。您检查 if(!prev.equals..) 是否有新模块,但这意味着仅存储某个模块的第一次出现(如果您的文件已排序)。如果列表没有排序,它会在进程中的某个地方被覆盖。

您的整个功能似乎有点错误。 :) 还要检查你使用临时数组列表的代码,因为你总是添加问题和答案。因此,一些问题和答案甚至会被错误的模块保存。而在 while 循环的第一次运行时 l_temp_array 似乎是空的,所以你将 module1 与一个空值添加到 HashMap..

【讨论】:

  • HashMap 不能有一个键不止一次是好的。如果我向同一个键添加新值,则应将其替换为新值。因此,当我尝试获取该键的值时,我应该获取最近的值。我错了吗?
  • 没错,最后一次 HashMap.put(key, value) 调用会出现在HashMap
  • 但我并没有单独获得几个键的值。这就是我的问题所在。
  • 更新了我上面的答案。
【解决方案2】:

您的代码的问题是它不能很好地处理模块名称未排序的情况,例如

module1.q1=a1
module2.q1=a1
module1.q2=a2
module2.q5=a6

您可以直接将值添加到哈希图中,而无需使用临时列表,如下所示:

objectsHmp temp = new objectsHmp(kss[1],ss[1]);
ArrayList<objectsHmp> list = l_extract.get(kss[0]);
if(list == null){
    list = new ArrayList<objectsHmp>();
    l_extract.put(kss[0], list);
}
list.add(temp);

此解决方案将消除我在开头提到的风险。

此外,您没有 100% 遵循 Java 表示法约定,例如方法名称的首字母应大写;对于变量名,首选驼峰命名法而不是下划线。

【讨论】:

  • 同意hashmap直接加值和约定。我对模块名称的文本文件进行了排序,所以我不太关心那部分,但我怀疑可能有一些重复的模块名称。
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2013-09-16
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多