可能重复:
如何实现具有多个键的地图?
单值映射 Java 的多个键
我必须根据两个传入的字符串属性获取枚举的值。我一直将其作为单个值的映射。现在我面临着进行串联。有没有办法让地图有两个键,这样我就可以
Map.get("attr1","attr2");
这将返回正确的枚举。还是我只需要连接所有可能的值并将其用作键?
我正在寻找干净利落的解决方案(我们不都是:P)
可能重复:
如何实现具有多个键的地图?
单值映射 Java 的多个键
我必须根据两个传入的字符串属性获取枚举的值。我一直将其作为单个值的映射。现在我面临着进行串联。有没有办法让地图有两个键,这样我就可以
Map.get("attr1","attr2");
这将返回正确的枚举。还是我只需要连接所有可能的值并将其用作键?
我正在寻找干净利落的解决方案(我们不都是:P)
好吧,你可以使用Map<String, Map<String, YourEnum>>
.
我们经常使用它,因此制作了自己的Map
实现,提供两个键并在内部使用 map-of-maps 方法。
你可以有一张地图,即
Map.get("attr1").get("attr2");
或者您可以使用 equals 方法定义一个对象,即
Map.get(new MyObject("attr1", "attr2"));
在这种情况下,我将使用这两个属性创建一个包装类,实现equals()
并且可能实现Comparable
并compareTo
委托给复合键的两个元素。并使用此类作为地图的关键。
这就像滚动你自己的Pair
课程。看看这个问题的答案,详细说明这个问题:Java 中 C++ 对的等价物是什么?
为什么不创建一个包含两个键的类并将其用作映射键?
例如:
public class BiKey implements comparable<BiKey>
{
private String key1;
private String key2;
// getters and setters
// equals and hash code.
// implement comparable.
}
Map <BiKey, Blammy> blammyMap; // Blammy is the value type.
与 Thomas 的方法类似,我们(在我的工作中)有“维度”地图类,它们是几个地图的简单包装器。
public class MultiKeyMap {
private HashMap<keyOne, Object> keyOneToObjectMap;
private HashMap<keyTwo, Object> keyTwoToObjectMap;
...etc
}
保持所有地图彼此同步非常容易,并且允许在没有大量潜在复杂代码的情况下进行相当快速的搜索。(但是,这是以增加内存使用为代价的)
org.apache.commons.collections.map.MultiKeyMap 是你想要的
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiKeyMap.html
例子
private MultiKeyMap cache = MultiKeyMap.decorate(new LRUMap(50));
public String getAirlineName(String code, String locale) {
String name = (String) cache.get(code, locale);
if (name == null) {
name = getAirlineNameFromDB(code, locale);
cache.put(code, locale, name);
}
return name;
}