我有一些统计计算数据,
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;
}
}
答案 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);
}