如果您愿意使用第三方库,最简单的方法是使用 Guava 的 Table。
它是这样工作的:
Table<String, String, Object> table = HashBasedTable.create();
table.put(index1, index2, obj);
Object retrievedObject = table.get(index1, index2);
您可以按照以下说明将其添加到您的项目中:How to add Guava to Eclipse project
如果你不想使用 Guava,那你就有大问题了。如果您尝试使用新的第一个键插入元素,则必须确保内部映射已经存在。这意味着,每次您执行put 时,您都必须检索innerMap,查看它是否存在,如果不存在则创建它。 每次调用 Map.put 时都必须这样做。此外,如果在内部映射上调用 get 时内部映射不存在,则可能会抛出 NullPointerException。
如果您这样做,应该将您的Map<String, Map<String, Object> 包装在一个外部类中以管理这些问题,或者使用Java 8 的computeIfAbsent。但最简单的方法是只使用上面的Table。
如果您使用自己的类而不是 Table,它会是这样的:
public class DoubleMap<R, C, V> {
private final Map<R, Map<C, V>> backingMap;
public DoubleMap() {
this.backingMap = new HashMap<>();
}
public V get(R row, C column) {
Map<C, V> innerMap = backingMap.get(row);
if(map == null) return null;
else return innerMap.get(column);
}
public void put(R row, C column, V value) {
Map<C, V> innerMap = backingMap.get(row);
if(innerMap == null) {
innerMap = new HashMap<C, V>();
backingMap.put(row, innerMap);
}
innerMap.put(column, value);
}
}
你可以通过这样做来使用这个类:
DoubleMap<String, String, Object> map = new DoubleMap();
请注意,此答案的功能比 Guava 版本少很多。