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

Java:在HashMap中以字符串为键使用ArrayList

连正信
2023-03-14

我看不出我的bug在哪里,我得到的是一个字符串数组,逐行包含以下值:

San Jose -> San Francisco
San Jose -> Anchorage
New York -> Anchorage
New York -> San Jose
New York -> San Francisco
New York -> Honolulu
Anchorage -> New York
Anchorage -> San Jose
Honolulu -> New York
Honolulu -> San Francisco
Denver -> San Jose
San Francisco -> New York
San Francisco -> Honolulu
San Francisco -> Denver

我想使用右边的字符串作为键将这些值放在HashMap中,并将值设置为ArrayList,这样,如果我请求“San Jose”的目的地,它将遍历列表并返回“旧金山”和“Anchorage”。我还没有设法使关键价值关系正常运作。方法运行完成时的原因。对于任何一个城市来说,其价值都将是其最后一次迭代(旧金山)的价值,返回纽约、檀香山和丹佛的所有关键点。

    private void createDataBase()
{   
    ArrayList<String> tempValues = new ArrayList <String>();
    for (int i = 0; i < database.size();i++) 
    {
        String line = database.get(i);
        //String value = "";  
        if (line.length() > 1)
        {
            int keyStart = 0;
            int keyEnd = line.indexOf("-");

            int valueStart = keyEnd+3;
            int valueEnd = line.length();

            String key = line.substring(keyStart, keyEnd);
            String value = line.substring(valueStart, valueEnd);
            tempValues.add(value);
            System.out.println(keyValueDatabase.toString());
            keyValueDatabase.put(key, tempValues);

        }
        else 
        {
            tempValues.clear();
        }

    }
    System.out.println(keyValueDatabase.toString());
}

共有3个答案

董同
2023-03-14

您的这段代码是错误的:

tempValues.add(value);
System.out.println(keyValueDatabase.toString());
keyValueDatabase.put(key, tempValues);

您需要执行以下操作,而不是上述操作:

List<String> values = keyValueDatabase.get(key);
if (values == null) {
   values = new ArrayList <String>();
   keyValueDatabase.put(key, values);
}
values.add(value);

...并删除tempValues。

蒋高超
2023-03-14

下面是另一个要查看的值:

我想你可以检查“keyValueDatabase”映射,看看键是否已经在映射中,如果它不存在,请添加一个新列表作为值,如果它确实抓取了列表并向其中添加了一个项目。

private void createDataBase()
{
    for (int i = 0; i < database.size();i++) 
    {
    String line = database.get(i);
    //String value = ""; 
    if (line.length() > 1)
    {
        int keyStart = 0;
        int keyEnd = line.indexOf("-");

        int valueStart = keyEnd+3;
        int valueEnd = line.length();

        String key = line.substring(keyStart, keyEnd);
        String value = line.substring(valueStart, valueEnd);
        tempValues.add(value);
        System.out.println(keyValueDatabase.toString());

        //Check if the map already contains an entry for the key
        if(keyValueDatabase.containsKey(key))
        {
        //If yes, grab the value and add one to the list
        ArrayList<String> tempValues = keyValueDatabase.get(key);
        tempValues.add(value); //this should get updated in the same list due to reference
        }
        else
        {   ArrayList<String> tempValues = new ArrayList <String>();
        tempValues.add(value);
        keyValueDatabase.put(key, tempValues);
        }                        
    }
    }
    System.out.println(keyValueDatabase.toString());
}
姜俊民
2023-03-14

除非您不能使用外部库,否则您可能需要考虑多值映射

 类似资料:
  • 问题内容: 我试图理解为什么当用作Hashmap密钥时,将String和Stringbuilder / StringBuffer区别对待。让我通过以下插图使我的困惑更加清楚: 示例1,使用String: 上面的代码片段打印为“ 1”。 Example#2,使用StringBuilder(或StringBuffer): 上面的代码片段打印为“ 2”。 任何人都可以解释一下行为差异的原因。 问题答案:

  • 以下是相关的更新代码位。正如用户carmickr所建议的,我使用DefaultListModel来处理地址簿HashMap中的数据。 然后在UserInterface构造函数内部:

  • 我在数据库表列中有手机号码,格式为,后面是,所以手机号码格式是这样的, 我有一个HashMap包含像这样的5个国家的国家代码, 我的豆子结构是这样的 现在,我的任务是从数据库表列中提取手机号码,并将其分成两部分,然后设置和,但国家代码长度(在地图键中)在3到4之间变化。这个检查可以通过使用和来完成,但我认为这不是正确的方法,那么解决这个问题的优雅(可能是签入)方法是什么呢?

  • 问题内容: 我有一个Java属性文件,并且有一个as 。因此,在加载如下所示的属性文件后,我使用方法检索的:: 然后 我需要从上面的字符串创建一个HashMap。应该是HashMap中,并应第秒。 如果是硬连线的,则如下所示: 问题答案: 将该方法与分隔符一起使用,以获取对列表。迭代对,然后再次使用分隔符以获取每个对的键和值。

  • 问题内容: 由于以下原因,我想使用不区分大小写的字符串作为HashMap键。 在初始化期间,我的程序使用用户定义的String创建HashMap。 在处理事件(在我的情况下为网络流量)时,我可能会在其他情况下收到String,但是我应该能够忽略HashMap中的来自我的情况而从HashMap 定位。 我遵循了这种方法 LookupCode.java 因此,我为每个事件创建一个CaseInsensi

  • 主要目标是用hashmap中的值替换字符串中的一些单词作为关键字(关键字是文本中的单词)。钥匙的格式不同。例如:主文本:“Lookahead和Lookahead,统称为Lookahead,是[0-23]断言”hashmap:{Lookahead=test1,Lookahead=test2,Lookahead=test3,[0-23]=newvalue}预期输出:“test1和test2,统称为te