我有一个类似下面格式的文本文件
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无法获取列表中存在的键的值的可能性有多大?或者我在这里犯了一个大错误?
答案 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符号而不是下划线。