Hashmap无法获取我的密钥的值

时间:2013-12-03 13:33:29

标签: java arraylist hashmap

我有一个类似下面格式的文本文件

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

我有一个类objectsHmp,它有两个String变量来存储问题(q1,q2,q3,...)和答案(a1,a2,a3,..)。我想要做的是将模块id保持为键,我想用一个hashmap填充一个hashmap作为对象的arraylist(objectsHmp)。反过来,我将密钥存储在String的arraylist中。

在下面的代码段中,

* l_ext_keys * 是String的arraylist,用于存储密钥, * l_extract * 是HashMap>,
* l_temp_array * 是对象对象的一个​​arrayl,

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更多)。

这种差异的一个可能原因是重复了一些模块。    我dint覆盖任何函数

问题 hashmap无法获取列表中存在的键的值的可能性有多大?或者我在这里犯了一个大错误?

2 个答案:

答案 0 :(得分:3)

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

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

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

之后,您可以使用键q1

检索包含q1值的ArrayList

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

你的整个功能似乎有点儿麻烦。 :)还要检查使用temp arrayList的代码,因为你总是添加问题和答案。所以有些问题和答案甚至可以用错误的模块保存。并且在while循环的第一次运行时,l_temp_array似乎为空,因此您将带有空值的module1添加到HashMap ..

答案 1 :(得分:0)

代码的问题在于,当模块名称未排序时,它无法处理好的情况,例如

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

您可以直接向hashmap添加值,而无需使用临时列表,如下所示:

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表示法约定,例如方法名称应该有首字母;对于变量名称,首选camelCase符号而不是下划线。