Как получить значение 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 и наложить на него все ссылки для каждого цикла. Это намного проще.