5

Apache Commons Collectionsを使用して、対応する1つの値を持つ2つのキーを格納するMultiKeyMapを作成し、MapIteratorを使用してマップをウォークスルーしています。私が抱えている問題は、MapIteratorによって返されたキーを、単一の「コンポジット」ではなく、個々のキーに戻す必要があることです。「composite」キーを含む文字列を分割したり、リフレクションを使用したりすることはできますが、これらのオプションはどちらも非常にエレガントに見えません。

問題をモデル化するために、次のサンプルコードを作成しました

MultiKeyMap multiKeyMap = new MultiKeyMap();

multiKeyMap.put("Key 1A","Key 1B","Value 1");
multiKeyMap.put("Key 2A","Key 2B","Value 2");
multiKeyMap.put("Key 3A","Key 3B","Value 3");

MapIterator it = multiKeyMap.mapIterator();

while (it.hasNext()) {
    it.next();
    System.out.println(it.getKey());
    System.out.println(it.getValue());
}

it.getKey()MultiKey [Key 3A、Key 3B]を返しますが、私がやりたいのは、キーを個々の変数に割り当てることです。たとえばmyKey1 = it.getKey().keys[0]myKey2 = it.getKey().keys[1]JavaDocでこれを実現するものが見つかりません。

リフレクションを使用したり、it.getKey()によって返された文字列を操作したりせずに、MapIteratorによって返されたキーを個々のキーに分割することは可能ですか?

4

1 に答える 1

8

commons 3.2のソースコードを確認しました。MultiKeyMapキーは、getKey(int index)メソッドを持つMultiKeyのインスタンスです。Object []を返すgetKeys()メソッドもあります。キャストが必要ですが、次のことができます。

MultiKeyMap multiKeyMap = new MultiKeyMap();

multiKeyMap.put("Key 1A","Key 1B","Value 1");
multiKeyMap.put("Key 2A","Key 2B","Value 2");
multiKeyMap.put("Key 3A","Key 3B","Value 3");

MapIterator it = multiKeyMap.mapIterator();

while (it.hasNext()) {
    it.next();

    MultiKey mk = (MultiKey) it.getKey();

    // Option 1
    System.out.println(mk.getKey(0));
    System.out.println(mk.getKey(1));

    // Option 2
    for (Object subkey : mk.getKeys())
      System.out.println(subkey);

    System.out.println(it.getValue());
}
于 2012-07-16T20:42:05.207 に答える