我有一个如下格式的文本文件
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无法获取列表中存在的键的值的可能性是什么?或者我在这里犯了什么大错误?
在哈希映射中,密钥不可能多次出现。密钥必须唯一。所以现在就用你的方法覆盖旧的关键点。
您可以将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符号而不是下划线。