30

如果我有一个带有这样的键的 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);
 }
4

5 回答 5

50

我刚刚遇到了同样的问题,并决定将我的密钥映射到一个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();

我个人对此的使用是命名函数的映射。按名称选择函数后,该函数将运行,布尔值将确定处理过程中是否需要清理。

于 2015-11-04T16:49:24.487 回答
26

您创建一个对象,该对象将键的所有三个子键作为属性保存。确保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"));

玩得开心!

于 2013-01-03T22:37:23.403 回答
4

您还可以尝试使用类型为的嵌套哈希图, HashMap<String, HashMap<String, HashMap<String, String>>>然后将查询公式化为 map.get(date).get(title).get(link)

最好的解决方案是将这个嵌套的 hashmap 封装在您自己的类中,如下所示:

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...
    }
}
于 2013-01-03T22:46:16.730 回答
2

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

例如:

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

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

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

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

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...
    ...
  }
}

然后你可以定义你的地图,如:

哈希映射

并使用 DateAndTitle 对象来索引您的地图。

于 2013-01-03T22:41:36.370 回答
-2

就我而言,我找到了另一种解决方案:创建一个 ArrayList 并将每个 for 循环中的所有链接放在上面。这要容易得多。

于 2013-01-03T22:54:17.910 回答