2012-08-07 52 views
1

大师,我很难传递一个双向链表的数组作为参数。Java:通过一个双向链表的数组列表作为参数

我需要在涉及链表的数据结构中表示方矩阵。我决定使用双向链表的数组列表。从文本文件中读取矩阵的信息,存储在:

ArrayList<DoubleLinkedList<Integer>> dLLArrayList 

在第一输入读取后,dllArryList有内容"[[5]]"

我试图通过调用定义自我的构造函数创建一个新的矩阵对象矩阵类:

Matrix mx1 = new Matrix (dimension, dLLArrayList); 

**尺寸仅仅是存储矩阵的大小int变量,比如说1对于1由1矩阵,对输入的文本文件所指示的。

然而,正如我尝试打印出Matrix类内的基质含量,它返回"[[]]":

System.out.println (this.getMatrixArrayList()); 

这里是假设设定Matrix对象的ArrayList的元素的矩阵类内的设置方法:

public void setMatrixArrayList(ArrayList<DoubleLinkedList<Integer>> matrixArrayList) { 
    for(int i = 0; i < matrixArrayList.size(); i ++){ 
     for (int j = 0; j < matrixArrayList.get(i).size(); j ++) { 
      this.rowItemList.add(matrixArrayList.get(i).get(j)); 
     } 
     this.matrixArrayList.add(this.rowItemList); 
     this.rowItemList.clear(); 
    } 
} 

任何理由,这将无法正常工作?建议,评论?

+0

请正确格式化您的代码... – oldrinb 2012-08-07 03:06:07

+0

感谢您的正面转向,我只是更正了代码格式。这是我在stackoverflow上的第一篇文章。 – Hank 2012-08-07 03:38:09

+0

它可能是我的程序的其他部分不是很有效。我会保持这张贴更新。 – Hank 2012-08-07 03:45:10

回答

2

问题是你清除了rowItemList。当您将rowItemList添加到数组列表时,您只需将参考放置在那里。因此,稍后清除它时,刚刚添加到arraylist中的链表也会被清除。当您将其添加到外部列表中时,您需要克隆rowItemList。

public void setMatrixArrayList(ArrayList<DoubleLinkedList<Integer>> matrixArrayList) { 
for(int i = 0; i < matrixArrayList.size(); i ++){ 
    for (int j = 0; j < matrixArrayList.get(0).size(); j ++) { 
     this.rowItemList.add(matrixArrayList.get(0).get(j)); 
    } 
    this.matrixArrayList.add(this.rowItemList.clone()); 
    this.rowItemList.clear(); 
} 
} 
+0

感谢您的评论Masood_mj。你说得很好。但是,好像clone()不是可以直接使用的方法。我会尝试在我的DoubleLinkedList类中添加一个覆盖方法,看看这是否能解决问题。 – Hank 2012-08-07 03:54:59

+0

这就对了,我忘记了你自己实现了DoubleLinkedList类。你可能想看看LinkedList克隆实现来获得一些想法 – 2012-08-07 04:50:00

+0

@HangYu:你使用'rowItemList'的方式没有意义。为什么要在其中一个函数的每个循环结束时清除一个列表实例变量?也许你想要在循环内部定义一个局部变量。 – newacct 2012-08-07 19:47:54

0

您不要在任何地方使用i

我怀疑你想:

for (int j = 0; j < matrixArrayList.get(i).size(); j ++) { 
     this.rowItemList.add(matrixArrayList.get(i).get(j)); 
    } 
+0

感谢您的意见约翰。你有一个好点,我更新了代码。但是,没有骰子。我会相应地更新帖子。 – Hank 2012-08-07 03:33:54

0

一个ArrayList或者LinkedList的只是其他链表

数组所以我假设

public ArrayList<ArrayList> methodTest(ArrayList<ArrayList> doubleList) {} 

会工作

+0

你是对的Dmor574。在我看来,困难在于你不能使用:“this.matrixArrayList = matrixArrayList;”在set方法中。 由于缺乏知识,我认为集合对象的行为与简单对象的行为不同。 – Hank 2012-08-07 03:40:38

+0

传递它们的问题在于它是通过引用传递的。这就是为什么我几乎总是创建包含数组列表的类变量的原因。如果我是你,我会创建一个单独的班级,管理双重阵列列表 – DMor 2012-08-07 03:48:45