0

我有一个 ,和的数据集row_id,用于输入矩阵(即一些 2D 数据结构),并且这些值在输入中没有按排序顺序给出。col_idvalue

例如。

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

等等。

我不知道 or 的最大可能值,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有点陌生,所以我很感激任何帮助。谢谢你。

4

2 回答 2

0

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

您可以拥有一个大地图,其中 (row,col) 作为到值的复合键映射。或者您可以有一个两级映射,其中行映射到其他映射,将列映射到值。如果不知道更多关于你的限制或目的,很难说更多。

于 2013-07-11T22:27:32.620 回答
0

您可以使用HashMap行为类似于关联数组的 java,其中您可以拥有一个对象的键和一个对象的值。查看HashMap的。还有一种size方法HashMap可能对您有用。

于 2013-07-11T22:27:54.110 回答