Разбить MultiKey, возвращаемый MapIterator, на отдельные ключи

Я использую Apache Commons Collections для создания MultiKeyMap, в котором будут храниться два ключа с одним соответствующим значением, а затем использую MapIterator для обхода карты. У меня проблема в том, что мне нужно разбить ключи, возвращенные MapIterator, обратно на отдельные ключи, а не на один "составной". Хотя я мог бы разбить строку, содержащую "составной" ключ, или использовать отражения, ни один из этих вариантов не кажется очень элегантным.

Чтобы смоделировать проблему, я создал следующий пример кода

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 для достижения этой цели.

Можно ли разбить ключи, возвращаемые MapIterator, на отдельные ключи без использования отражений или манипулирования строкой, возвращаемой it.getKey()?

1 ответ

Решение

Я проверил исходный код для общих 3.2. Ключи MultiKeyMap являются экземплярами MultiKey, который имеет метод getKey(int index). Существует также метод getKeys(), который возвращает Object[]. Требуется приведение, но вы можете сделать:

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());
}
Другие вопросы по тегам