我应该使用哪种Java数据结构在给定索引处输入double值而不给出固定大小?

时间:2013-07-11 22:22:47

标签: java hadoop

我有一个row_idcol_idvalue的数据集用于输入矩阵(即某些2D数据结构),并且这些值未按排序顺序给出输入。

例如

1,1,0.3
4,1,0.5
2,3,0.4

等等。

我不知道row_IDcol_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有些新意,所以我感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:0)

如果ID很大,则数组或List将是一个非常糟糕的选择,因为您将被迫分配主要浪费的内存。标准解决方案是将稀疏矩阵表示为映射。

您可以拥有一个大地图,其中(row,col)作为映射到该值的复合键。或者,您可以拥有一个两级映射,其中行映射到其他映射,这些映射将列映射到值。在不了解您的约束或目的的情况下,很难说不仅如此。

答案 1 :(得分:0)

你可以使用一个java HashMap,它的行为非常类似于一个关联数组,你可以拥有一个作为Object的键和一个作为Object的值。看看HashMap的。 size上还有HashMap方法可能对您有用。