Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:在HashMap中使用ArrayList,并将字符串作为键_Java_Arraylist_Hashmap - Fatal编程技术网

Java:在HashMap中使用ArrayList,并将字符串作为键

Java:在HashMap中使用ArrayList,并将字符串作为键,java,arraylist,hashmap,Java,Arraylist,Hashmap,我看不出我的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 Honolul

我看不出我的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”的目的地,它将遍历列表并返回“San Francisco”和“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());
}
private void createDataBase()
{   
ArrayList tempValues=新的ArrayList();
对于(int i=0;i1)
{
int keyStart=0;
int keyEnd=line.indexOf(“-”);
int valueStart=keyEnd+3;
int valueEnd=line.length();
String key=line.substring(keyStart,keyEnd);
字符串值=行.子字符串(valueStart,valueEnd);
tempValues.add(value);
System.out.println(keyValueDatabase.toString());
keyValueDatabase.put(key,tempValues);
}
其他的
{
tempValues.clear();
}
}
System.out.println(keyValueDatabase.toString());
}

< /代码> 除非您不能使用外部库,否则您可能需要考虑

这段代码是错误的:

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);
List values=keyValueDatabase.get(key);
如果(值==null){
values=newarraylist();
keyValueDatabase.put(键,值);
}
增加(价值);

…并删除
tempValues

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

我想你可以检查“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());
}
private void createDataBase()
{
对于(int i=0;i1)
{
int keyStart=0;
int keyEnd=line.indexOf(“-”);
int valueStart=keyEnd+3;
int valueEnd=line.length();
String key=line.substring(keyStart,keyEnd);
字符串值=行.子字符串(valueStart,valueEnd);
tempValues.add(value);
System.out.println(keyValueDatabase.toString());
//检查映射是否已包含密钥的条目
if(keyValueDatabase.containsKey(键))
{
//如果是,则获取值并将其添加到列表中
ArrayList tempValues=keyValueDatabase.get(key);
tempValues.add(value);//由于引用的原因,应该在同一列表中更新此值
}
其他的
{ArrayList tempValues=新的ArrayList();
tempValues.add(value);
keyValueDatabase.put(key,tempValues);
}                        
}
}
System.out.println(keyValueDatabase.toString());
}

与您的问题无关,但如果同一个目的地只出现一次,您也可以使用集合来保证这一点:TreeSet(如果您希望目的地始终排序),LinkedHashSet(如果您希望按原始顺序迭代),HashSet(否则)。我更喜欢我的答案中的方式,因为它只会对现有项目执行一次映射查找,如果映射碰巧包含空值(尽管这里不是这种情况),它也会起作用。@hyde:是的,你是对的。您的方式将导致更少的地图查找。。。谢谢