提问者:小点点

Hashmap无法获取密钥的值


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

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

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

在下面的代码段中,

*l_ext_keys*是存储键的字符串数组列表,*l_extract*是HashMap

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\u ext\u键中存在的某些键的值。我试着打印arraylist和hasmap的长度,但它有很大的不同(arraylist中的键的值比hashmap多)。

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

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


共2个答案

匿名用户

在哈希映射中,密钥不可能多次出现。密钥必须唯一。所以现在就用你的方法覆盖旧的关键点。

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

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

之后,可以使用键q1检索保存q1值的ArrayList

编辑:您的代码缺少一些信息,但据我所知,您正在将module1等作为hashmap中的键。如果(!prev.equals..),则进行检查对于新模块,但这意味着仅存储某些模块的第一次出现(如果文件已排序)。如果列表未排序,则会在进程中的某个位置被覆盖。

您的整个功能似乎有点问题。:)还要检查使用临时数组列表的代码,因为您总是向其中添加问题和答案。所以有些问题

匿名用户

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

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符号而不是下划线。