如何使用三个值获取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(); 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); } 

我刚遇到同样的问题,决定将我的密钥映射到一个条目 。 这允许由地图提供的相同索引特征,同时具有与键相关联的多个属性。 我认为这是一个更简洁的解决方案,可以创建一个单独的类或嵌套映射。

 Map> actionMap = new HashMap>(); actionMap.put("action_name", new SimpleEntry(action, true)); 

稍后使用数据:

 Entry actionMapEntry = actionMap.get("action_name"); if(actionMapEntry.value()) actionMapEntry.key().applyAction(); 

我个人使用的是一个命名函数的地图。 通过名称选择函数后,将运行该函数,并且布尔值将确定在处理中是否需要清理。

您创建一个对象,该对象将键的所有三个子键保存为属性。 确保正确实现equalshashCode

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

使用此类对象作为地图的关键字:

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

玩的开心!

您还可以尝试使用HashMap>>类型的嵌套hashmap,然后在其中将查询表示为map.get(date).get(title).get(link)

那么最好的解决方案是将这个嵌套的hashmap封装在你自己的类中:

 public class NestedHashmap { private Map>> map; public NestedHashMap() { map = new HashMap>>; } public put(String date, String title, String link, String value){ if(map.get(date) == null) { map.put(date, new HashMap>; } if(map.get(date).get(title) == null){ map.get(date).put(new HashMap); } map.get(date).get(title).put(link, value); } public get(String date, String title, String link) { // ...mostly analogous to put... } } 

您可以创建一个复合键,其中包含键中所需的所有值。 一种简单的方法是将组成键的值连接在一起,由您确定不会出现在键值中的值分隔。

例如:

 String makeCompoundKey(String pubDate, String title) { return pubDate + "|" + title; } HashMap map = new HashMap(); map.put(makeComoundKey(pubDate,title), link) 

为了避免必须选择不出现在任何键值中的字符的问题,要处理非字符串键并可能获得更好的性能,您可以声明一个新类来包含键值并覆盖equalshashCode方法:

 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对象来索引您的地图。

在我的例子中,我找到了另一种解决方案:创建一个ArrayList并在每个for循环上放置所有链接。 这更容易。