Как перебрать несколько карт - PullRequest
2 голосов
/ 19 июля 2011

Итак, по сути, у меня есть две хэш-карты, одна из которых содержит следующие значения:

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 или чего-то еще, но я не совсем уверен, как это сделать. Любая помощь будет оценена. Заранее спасибо за любые ответы.

Отредактированный код с помощью Божо

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 ]

10 голосов
/ 19 июля 2011

Из того, что я вижу, вам не нужно повторяться. Просто:

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

Если вы не всегда знаете, является ли это value1 + ".jpeg", но вы просто знаете, что ключ начинается с первого значения, тогда вы можете повторить 2-ую карту с помощью:

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 голос
/ 19 июля 2011

Это кажется очень неэффективным.Весь смысл хэш-карты в том, чтобы делать быстрый поиск.Вам действительно нужно использовать этот 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
}
...