以下是比较矩阵:
val1,val2,val3
val1,1, 5, 4
val2,5, 3, 5
val3,4, 5, 6
访问此矩阵中的值的有效方法是什么?因此,例如val2,val1返回5& val3,val1返回4
这是一种可能的方法签名:
public int getValue(String name1 , String name2){
.....
return value
}
并致电:
getValue(val2 , val1)
返回5
一种可能的解决方案是创建一个地图数据结构,其中键是val字符串的组合:
map.put("val1,val1" , 1);
map.put("val1,val2" , 5);
map.put("val1,val3" , 4);
然后返回上面定义的方法getValue中的值:
public int getValue(String name1 , String name2){
return map.get(name1+","+name2)
}
这是一个可行的解决方案还是有更可行的选择。所讨论的矩阵的维数为100000 x 100000
Update1:矩阵是对称的
Update2:矩阵可能在地方稀疏
答案 0 :(得分:5)
我认为您应该创建两个结构,而不是创建一个Map
结构:一个用于保存行标签,另一个用于保存列标签:
HashMap<String,Integer> rowMap, colMap;
rowMap = new HashMap<>();
colMap = new HashMap<>();
// Populate the maps with the row and column key-value pairs
public T getValueAt(String row, String col) {
return myMatrix[rowMap.get(row)][rowMap.get(col)];
}
答案 1 :(得分:2)
用于存储数据的实际矩阵怎么样?
// create and fill a matrix of the right dimensions
int[][] matrix = new int[3][3];
// create a map that maps row/col names to indexes
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("val1", 0);
map.put("val2", 1);
map.put("val3", 2);
// the actual method is straightforward
public int getValue(String name1 , String name2) {
int i = map.get(name1);
int j = map.get(name2);
return matrix[i][j];
}
另外,请注意矩阵的预期大小(100.000 x 100.000) large ,内存使用量将是您最关心的问题,创建如此大的数据可能是不可行的除非矩阵稀疏,否则需要设计不同的方法。
答案 2 :(得分:1)
如果不是矩阵中的所有项目都已填满,我建议您使用hashCode()
和equals()
这样的方法来实现一个特殊课程
class Cell {
String first;
String second;
public int hashCode() {
return first.hashCode() ^ second.hashCode();
}
public boolean equals(Object c) {
if (c instanceof Cell) {
return first.equals(((Cell)c).first) && second.equals(((Cell)c).second);
}
return false;
}
然后您可以将矩阵定义为
Map<Cell, Integer> matrix;
答案 3 :(得分:1)
而不是使用String
,你可以创建自己的小班:
class MatrixIndex {
public final int x, y;
public MatrixIndex(int x, int y) {
this.x = x;
this.y = y;
}
public int hashCode() {
return x ^ (y << 16) ^ (y >>> 16);
}
public boolean equals(Object o) {
if (o instanceOf MatrixIndex)
return o == this
|| (o.x == x) && (o.y == y);
else
return false;
}
public String toString() {
return "(" + x + "," + y + ")";
}
}
这将允许更快地访问大多数地图(如HashMap
s)内部作为构建引用,比较两个索引,并且散列给定索引比使用String对象快得多。
如果它实际上是你想要用于矩阵的X和Y索引的字符串,你也可以对String
个对象做类似的事情,但我猜你真的想通过整数来达到它。 / p>
这仅用于填充矩阵本身!如果您的矩阵非常稀疏,那么使用它只会很好!如果您还想要标记轴,您应该也执行Barranka所建议的,使用Maps for row&amp;来自String
s的列索引。
答案 4 :(得分:0)
我建议使用HashMap<String,HashMap<String,Integer>> map
。
public Integer getValue(String name1 , String name2){
HashMap<String,Integer> row =map.get(name1);
if(row!=null) return row.get(name2);
else return null;
}
这是不变的时间。