当前位置: 首页 > 知识库问答 >
问题:

Hashmap无法获取密钥的值

丁淇
2023-03-14

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

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个答案

葛深
2023-03-14

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

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

鄂坚
2023-03-14

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

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

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

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

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

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

 类似资料:
  • 问题内容: 我尝试从KeyStore获取密钥。我通过Keytool创建了一个密钥库: keytool -genkeypair -dname“ cn = Mark Jones,ou = JavaSoft,o = Sun,c = US” -alias business2 -keypass abcdtest -keystore C:\ workspace \ XMLSample \ keystore \

  • 问题内容: 我在Java中有一个Hashmap,如下所示: 然后我像这样填充它: 如何获得钥匙?类似于:返回“ United”。 问题答案: 一个包含多个键。您可以用来获取所有键的集合。 将存储与key 和key 。要遍历所有键: 将打印和。

  • 这是获取用户帐户及其Api密钥的endpoint:https://dev.openclinica.com/apidoc/#api-User_Account-getAccountByUserName使用带有postman的follingendpoint 后http://89.221.253.174:8080/OpenClinica/pages/accounts/login?username=pran

  • exception.message=“参数:连接字符串:[没有指定连接字符串],资源:https://vault.azure.net,权限异常消息:尝试了以下3种方法来获取访问令牌,但都不起作用。参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:异常消息:试图使用托管服务标识获取令牌。无法连接到托管服务标识(MSI)终结点。请检查您正在运行的Azu

  • 我尝试让 SHA1 用于火基地,但我无法获得 SHA1 在JavaVirtualMachines我使用jdk1.8.0_202.jdk 我试着进入梯度- = keytools-exportcert-alias androiddedegkey-keystore~/. android/debug.keystore-list-v keytool-list-v-keystore/Users/bobhope

  • 问题内容: 我只是想知道如何在中获取所有关键值。 我试图用一个简单的JavaScript循环来检索值 但是仅当键是从1开始的渐进数字时,它才有效。 如何显示所有键,以显示所有可用数据? 问题答案: 在ES2017中,您可以使用: