3

基本的に、次の値を含む 2 つのハッシュマップがあります。

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}

私は基本的に、最初のマップを反復処理し、キーの一致を見つけ、一致が見つかった場合は関連する値を取得し、次に2番目のマップを見て、キーで一致を見つけ、関連するものを引き出すことができるようにしたいと考えています値 (ファイル パスを意味します)。

たとえば、このようなことを考えていました(以下は簡略化されています)...

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);
        }
    }
4

2 に答える 2

11

私が見るところ、反復する必要はありません。ただ:

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)(両方の操作に一定の時間がかかります)、2 番目のコードはO(n)


そして、タイトルで定式化されているように質問に答えるには:

両方のマップの反復子を取得し、ループ内で and を使用it1.next()します。いずれかのマップにそれ以上要素がない場合 ( ) - 中断します。it2.next()whileit.hasNext()

于 2011-07-19T17:09:28.633 に答える
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
}
于 2011-07-19T17:27:26.747 に答える