Как получить значение HashMap с тремя значениями

Если у меня есть HashMap с таким ключом: [pubDate, title, link] и такое значение (пример):

[Thu, 03 Jan 2013 21:50:02 +0100, Transferts - YBX : ''Je change de dimension'', http://www.link.fr/info/link_informations.html]

Можно ли получить ссылку http://www.link.fr/info/link_informations.html? Код:

    for (int i = 0; i < nl.getLength(); i++) {
                    // creating new HashMap
                    map = new HashMap<String, String>();
                    Element e = (Element) nl.item(i);
                    // adding each child node to HashMap key => value
                    map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
                    map.put(KEY_LINK, parser.getValue(e, KEY_LINK));

                    map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
                    //map.put(KEY_DESC, parser.getValue(e, KEY_DESC));

                    // adding HashList to ArrayList
                    menuItems.add(map);
 }

Ответ 1

Вы создаете объект, который содержит все три подраздела ключа в качестве атрибутов. Обязательно выполняйте equals и hashCode.

public class MyKey {
  public MyKey(String subkey1, String subkey2, String subkey3) {
    ...
  }
}

Используйте такой объект как ключ вашей карты:

Map<MyKey, String> myMap = ....;
myMap.get(new MyKey("Thu", "03 Jan 2013 21:50:02 +0100", "Transferts - YBX"));

Удачи!

Ответ 2

Я просто столкнулся с той же проблемой и решил сопоставить свой ключ с Entry. Это позволяет использовать те же функции индексирования, которые предоставляются картой, имея более одного свойства, связанного с ключом. Я думаю, что это гораздо более быстрое решение, создающее отдельный класс или карты вложенности.

Map<String, Entry<Action, Boolean>> actionMap = new HashMap<String, Entry<Action, Boolean>>();

actionMap.put("action_name", new SimpleEntry(action, true));

Чтобы использовать данные позже:

Entry<Action, Boolean> actionMapEntry = actionMap.get("action_name");

if(actionMapEntry.value()) actionMapEntry.key().applyAction();

Мое личное использование этого было отображением названных функций. Выбрав функцию по имени, функция будет запущена, и логическое значение будет определять, нужна ли обработка при обработке.

Ответ 3

Вы также можете попытаться использовать вложенный хэш файл, типа HashMap<String, HashMap<String, HashMap<String, String>>>, где вы затем сформулируете свой запрос как map.get(date).get(title).get(link)

Лучшим решением было бы инкапсулировать этот вложенный хэш файл в ваш собственный класс как таковой:

public class NestedHashmap {
    private Map<String, Map<String, Map<String, String>>> map;

    public NestedHashMap() { 
        map = new HashMap<String, HashMap<String, HashMap<String, String>>>;
    }

    public put(String date, String title, String link, String value){
        if(map.get(date) == null) { 
            map.put(date, new HashMap<String, HashMap<String, String>>;
        }
        if(map.get(date).get(title) == null){
            map.get(date).put(new HashMap<String, String>);
        }
        map.get(date).get(title).put(link, value);
    }

    public get(String date, String title, String link) {
        // ...mostly analogous to put...
    }
}

Ответ 4

Вы можете создать составной ключ, который содержит все нужные значения в ключе. Простой способ сделать это может заключаться в том, чтобы объединить вместе значения, составляющие ваш ключ, ограниченные значением, которое, как вы уверены, не будет отображаться в значениях ключа.

например:.

String makeCompoundKey(String pubDate, String title) {
  return pubDate + "|" + title;
}

HashMap<String,String> map = new HashMap<String,String>();

map.put(makeComoundKey(pubDate,title), link)

Чтобы избежать проблемы выбора символа, который не отображается ни в одном из значений ключа, для обработки ключей, отличных от String, и, вероятно, для повышения производительности, вы можете объявить новый класс, содержащий ваши значения ключа и переопределить методы equals и hashCode:

final class DateAndTitle {
  private final Date pubDate;
  private final String title;

  @Overrde
  boolean equals(Object rhs) {
    // let eclipse generate this for you, but it will probably look like ...
    return rhs != null && rhs.getClass() == getClass() &&
      pubDate.equals(rhs.pubDate) && title.equals(rhs.title);
  }

  @Overrde
  int hashCode(Object) {
    // let eclipse generate this for you...
    ...
  }
}

Затем вы можете определить свою карту следующим образом:

HashMap

и используйте объект DateAndTitle для индексации вашей карты.

Ответ 5

В моем случае я нашел другое решение: создать ArrayList и наложить на него все ссылки для каждого цикла. Это намного проще.