如何迭代多个地图

时间:2011-07-19 17:07:27

标签: java collections map hashmap linkedhashmap

基本上,我有两个哈希图,一个包含以下值:

rId33=image23
rId32=image22
rId37=image2

另一个包含这些数据:

{image2.jpeg=C:\Documents and Settings\image2.jpeg, image22.jpeg=C:\Documents and Settings\image22.jpeg, image23.jpeg=C:\Documents and Settings\image23.jpeg}

我基本上希望能够遍历第一个地图,找到匹配的密钥,如果找到匹配项,获取相关值,然后查看第二个地图,找到密钥中的匹配项,然后拉输出相关值(表示文件路径)。

我正在考虑做这样的事情(例如以下简化)......

String val2 = "rId33";

for (String rID: map.keySet())
{
     if (rID.contains(val2))
     {
         //enter code here
     }
}

我正在研究像.getValue之类的东西可用的方法,但我不完全确定如何做到这一点。任何帮助,将不胜感激。提前感谢您的回复。

Bozho帮助编辑代码

else if ("v:imagedata".equals(qName) && headingCount > 0)
{
    val2 = attributes.getValue("r:id");
    String rID = imageMap.get(val2);
    String path = imageLocation.get(rID + ".jpeg");

    for (String rels: imageMap.keySet())
    {
        if (rels.contains(val2))
        {
        inImage = true;
        image docImage = new image();

        imageCount++;

        docImage.setRelID(val2);
        docImage.setPath(path);
        addImage(docImage);
        }
    }

2 个答案:

答案 0 :(得分:10)

从我看到你不需要迭代。只是:

String value1 = map1.get(key1);
if (value1 != null) {
    String path = map2.get(value1 + ".jpeg");
}

如果您不总是知道它是value1 + ".jpeg",但您只知道该键以第一个值开头,那么您可以使用以下代码迭代第二个地图:

for (Map.Entry<String, String> entry : map2.entrySet()) {
    String key2 = entry.getKey();
    String value2 = entry.getValue();
    if (key.startsWith(value1)) {
        return value2;
    }
}

但请注意,第一个代码段为O(1)(两个操作都需要一段时间),而第二个代码段为O(n)


并回答标题中提出的问题:

获取两个地图的迭代器,并在it1.next()循环中使用it2.next()while。如果任何地图没有更多元素(it.hasNext()) - 中断。

答案 1 :(得分:1)

这似乎非常低效。哈希映射的整个点是进行快速查找。您真的需要在contains上使用rID来电吗?换句话说,您是否可以更改哈希映射,使其直接包含您要搜索的逐字字符串,而不仅仅是包含要作为子字符串搜索的字符串的字符串?如果是,您可以使用已经给出的答案。如果没有,如果您出于某种原因必须使用这些数据结构,那么您尝试做的事情的方式如下:

String val2 = "rId33";
String path;

for (String rID: map.keySet())
{
    if (rID.contains(val2))
    {
        path = secondMap.get(map.get(rID)+".jpeg");
        break;
    }
}
if (path == null)
{
   //value not found
}