我有一个row_id
,col_id
和value
的数据集用于输入矩阵(即某些2D数据结构),并且这些值未按排序顺序给出输入。
例如
1,1,0.3
4,1,0.5
2,3,0.4
等等。
我不知道row_ID
或col_ID
的最大可能值,因此我无法使用固定大小array
。我想过使用ArrayList
,但由于我需要在任何给定索引上输入值ArrayList
(比如行/列尚未初始化),我最终会得到一些奇怪的代码,因此,无论何时给定的行大小都不存在,我必须创建新的行。
public void reduce(LongWritable key, Iterable<Text> values, Context context throws IOException, InterruptedException{
ArrayList<ArrayList<Double>> vArray = new ArrayList<ArrayList<Double>>();
for(Text val : values){
String[] line = value.toString().split(",", 3);
int rowID = Integer.parseInt(line[0]);
int colID = Integer.parseInt(line[1]);
int value = Integer.parseInt(line[2]);
if(vArray.size() < rowID){ //checking if this row already exists
for(int i=0; i < rowID; i++){
//add a row
ArrayList<Double> row = new ArrayList<Double>();
vArray.add(row);
for(int j=0; j < colID; j++){
//add a column
vArray.get( array.size() -1 ).add( 1 );
}
}
}
有没有更好的方法呢?
此外,我认为 vArray.size()
不会给我行数,而是ArrayList
中的列数,但我希望数量为行,有没有办法得到它?
我对Java有些新意,所以我感谢任何帮助。谢谢。
答案 0 :(得分:0)
如果ID很大,则数组或List
将是一个非常糟糕的选择,因为您将被迫分配主要浪费的内存。标准解决方案是将稀疏矩阵表示为映射。
您可以拥有一个大地图,其中(row,col)作为映射到该值的复合键。或者,您可以拥有一个两级映射,其中行映射到其他映射,这些映射将列映射到值。在不了解您的约束或目的的情况下,很难说不仅如此。
答案 1 :(得分:0)
你可以使用一个java HashMap
,它的行为非常类似于一个关联数组,你可以拥有一个作为Object的键和一个作为Object的值。看看HashMap的。 size
上还有HashMap
方法可能对您有用。