我有一个2D整数数组。我希望将它们放入HashMap中。但是我想从基于数组索引的HashMap访问元素。就像是:
对于A [2] [5],map.get(2,5)它返回与该键关联的值。但是,如何使用一对密钥创建一个hashMap?或者通常是多个键:Map<((key1, key2,..,keyN), Value)以一种我可以使用get(key1,key2,… keyN)来访问元素的方式。
map.get(2,5)
Map<((key1, key2,..,keyN), Value)
编辑:发布问题3年后,我想再添加一点
我遇到了另一种方法NxN matrix。
NxN matrix
数组索引,i和j可被表示为一个单一的key方式如下:
i
j
key
int key = i * N + j; //map.put(key, a[i][j]); // queue.add(key);
索引可以通过key以下方式撤消:
int i = key / N; int j = key % N;
有几种选择:
Map<Integer, Map<Integer, V>> map = //... //... map.get(2).get(5);
public class Key { private final int x; private final int y; public Key(int x, int y) { this.x = x; this.y = y; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Key)) return false; Key key = (Key) o; return x == key.x && y == key.y; } @Override public int hashCode() { int result = x; result = 31 * result + y; return result; } }
在这里实施equals()和hashCode()至关重要。然后,您只需使用:
equals()
hashCode()
Map<Key, V> map = //...
和:
map.get(new Key(2, 5));
Table 从番石榴
Table
Table<Integer, Integer, V> table = HashBasedTable.create(); //... table.get(2, 5);
Table使用下方 的地图 。
请注意,特殊Key类是缩放到n维的唯一方法。您可能还会考虑:
Key
Map<List<Integer>, V> map = //...
但这从性能角度以及可读性和正确性(强制列表大小的简便方法)方面都是可怕的。
也许看看在Scala上有元组和case类的地方(用单线替换整个Key类)。
case