在无序的有缺口的数据

时间:2017-12-14 07:38:43

标签: java collections indexoutofboundsexception

我有一些统计计算数据,

        item1, item2, sim 
    ...
        9,471,0.9889886
        19,591,0.98890734
        453,15,0.98842293
        10,20,0.98759043
        68,713,0.9847893
        71,582,0.9836043
        95,13,0.98339003
        42,190,0.9832126
        1,52,0.9828053
        102,275,0.981985
        110,1115,0.9810662
        203,116,0.98054993
        1098,14,0.98008114
        13,56,0.9965508
        7,22,0.9963229
        69,96,0.9959787
        896,79,0.9959084
    ...

近20k行。

在Java中,我想从这个数据中填充如下所示的数组

array[col1][col2] = value

问题是'col1'和'col2'值不是连续的,有序的,并且最小 - 最大值之间存在间隙。

正如我所料,如果我想在java数组中填充这些数据,它会像我预期的那样给我'IndexOutOfBoundsException'

我尝试了一些ArrayList,Matrix,但是他们已经从零开始indis,它失去了数据的含义。 我想在迭代中再次将这些数据与自身进行比较,并想要一些计算距离等。

您指的是哪个Java Collection API?

修改:我粘贴了我的评论代码

public class CSVFileReader {

  public static final double[][] readItemSimilarityFromFile(File f)
      throws IOException {

    try (final BufferedReader br = new BufferedReader(new FileReader(f))) {

        // we have 20k line
        final int[][] matrix = new int[20000][20000];

        while ((String line = br.readLine()) != null) {
            int values = line.split(",", -1);
            matrix[values[0]][values[1]] = values[2];
        }
    }

    br.close();

    return matrix;

  }

}

1 个答案:

答案 0 :(得分:1)

您可以使用稀疏矩阵。

class Sparse<T> {
    Map<Integer, Map<Integer, T>> matrix = new HashMap<>();

    public T get(int row, int col) {
        Map<Integer, T> r = matrix.get(row);
        return r != null ? r.get(col) : null;
    }

    public void set(int row, int col, T t) {
        Map<Integer, T> theRow = matrix.get(row);
        if (theRow == null) {
            theRow = new HashMap<Integer, T>();
            matrix.put(row, theRow);
        }
        theRow.put(col, t);
    }
}

public void test(String[] args) {
    Sparse<Double> s = new Sparse<>();
    s.set(9, 471, 0.9889886);
    s.set(19, 591, 0.98890734);
    s.set(453, 15, 0.98842293);
    s.set(10, 20, 0.98759043);
    s.set(68, 713, 0.9847893);
    s.set(71, 582, 0.9836043);
    s.set(95, 13, 0.98339003);
    s.set(42, 190, 0.9832126);
    s.set(1, 52, 0.9828053);
    s.set(102, 275, 0.981985);
    s.set(110, 1115, 0.9810662);
    s.set(203, 116, 0.98054993);
    s.set(1098, 14, 0.98008114);
    s.set(13, 56, 0.9965508);
    s.set(7, 22, 0.9963229);
    s.set(69, 96, 0.9959787);
    s.set(896, 79, 0.9959084);
}