访问矩阵或x / y值的有效方法

时间:2013-12-17 20:27:14

标签: java matrix

以下是比较矩阵:

     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:矩阵可能在地方稀疏

5 个答案:

答案 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;
}

这是不变的时间。