2013-01-03 37 views
16

一个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

这些类有3个成员,或连接字符串,或其他? –

+1

向我们展示一些代码。 – MrSmith42

+0

@Oli Charlesworth:请参阅编辑的问题。 – androniennn

回答

17

您创建是关键作为属性的全部三个子项的对象。确保正确实施equalshashCode

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")); 

玩得开心!

+0

'您创建一个对象,将对象的所有三个值都保存为属性'。如何逐个检索三个值。将value1置于a中,value2置于b中,value3置于c中(示例)。 ? – androniennn

+0

我在哪里说“值”应该读取“子键”(现在更正) – SJuan76

+1

为我工作很好,谢谢!!,一个接一个地检索三个值,你可以在你的类上做这样的事情MyKey添加getters为值,例如:getName(){return this.name; }一旦你在你的关键类中拥有了所有的getter,你可以像这样迭代你的地图并且访问它的属性: for(MyKey key:map.keySet 。} – Israelm

2

您可以创建一个复合键,其中包含您想要的所有值。一个简单的方法可以将构成密钥的值连接在一起,用您确定的值分隔的值不会显示在密钥值中。

如:

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

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

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

3

你也可以尝试使用嵌套的HashMap,类型 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... 
    } 
} 
0

就我而言,我发现了另一种解决方案:就是创建一个ArrayList,并把它所有的环节上每一个for循环。这很容易。

15

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

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

+1

我知道这已经过去了几年,但我觉得这些信息对于那些仍在寻找解决方案的人来说很有用。 – ndm13

+1

你救了我的一天,谢谢你的队友! – LePhleg