【问题标题】:java multidimensional arraylistjava多维数组列表
【发布时间】:2014-05-21 16:07:23
【问题描述】:

我刚刚编写了这个函数来将值添加到多维数组列表中,但不明白为什么所有添加的值都会覆盖到最近的添加值中。我需要弄清楚为什么会这样。正如javadoc所说,它必须像这样“将指定的元素附加到此列表的末尾”。而且我在他的代码中看不到任何地方,以前的附加值可能会被覆盖。更奇怪的事情是数组的大小增加了

这是我的输出:

[0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] after add 0 [0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] after add 1 [0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] after add 2 [0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] after add 3 [0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] after add 4 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] after add 0 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] after add 1 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] after add 2 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] after add 3 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] after add 4 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] after add 5 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] after add 0 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] after add 1 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] after add 2 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] after add 3 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] after add 4 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] after add 5 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] after add 6

这是我的功能:

public void createArrayList(ArrayList<Double> list,ArrayList<Double>
listLaid,int size,double sum, double absValue){   
ArrayList<Double> workArray = new ArrayList<>();  
ArrayList<ArrayList<Double>>
workMatrix= new ArrayList<>();

double abs=0;
for(int a = 0; a < size ;a++){
     for(int b = 0; b < size ; b++){
           for (int c = 0 ; c < size; c++){

             abs =Math.abs(sum - list.get(a) - list.get(b) - list.get(c));
                 if( abs <= absValue){
                       double totalSum = listLaid.get(a) + listLaid.get(b) +                                            
                                         listLaid.get(c);
                       workArray.clear();
                       workArray.add(listLaid.get(a));
                       workArray.add(listLaid.get(b));
                       workArray.add(listLaid.get(c));
                       workArray.add(totalSum);
                       workArray.add(abs);

                       workMatrix.add(workArray);

                  }
              }
         } 
    }                   
} 
for (int i = 0; i < workMatrix.size(); i++)   
System.out.println(darbineMat.get(i)+"  after add  "+i);

【问题讨论】:

    标签: java arrays arraylist multidimensional-array


    【解决方案1】:

    您总是将列表的相同实例添加到列表中。这意味着最终 workMatrix 的所有行都相同

    您必须为每个新行创建一个新的ArrayList。更换

    workArray.clear();
    

    workArray = new ArrayList<Double>();
    

    这里应该足够了。


    编辑:“引用”的概念乍一看可能会令人困惑(并且有些编程语言中这个概念并不以相同的方式存在)。但是当您创建这样的列表实例时

    ArrayList<Double> workArray = new ArrayList<Double>();  
    

    那么workArray 只是对您正在创建的实例引用。你可以把它想象成一个“句柄”(事实上,它更像是 C/C++ 中的一个“指针”,但现在这可能变得太混乱了)。关键是当你写的时候

    ArrayList<ArrayList<Double>> workMatrix = new ArrayList<>();
    ArrayList<Double> workArray = new ArrayList<>();  
    workMatrix.add(workArray);
    

    那么您只需将 reference 添加到 workMatrix 列表中。这个 reference 仍然是指您创建的唯一一个实例:

    // This prints "true": The first element of the matrix
    // and the workArray are IDENTICAL. (Not only equal, 
    // but really IDENTICAL)
    System.out.println(workMatrix.get(0) == workArray);
    

    【讨论】:

    • 非常感谢!有效!但我仍然不明白为什么。似乎我正在清除旧的数组列表并从 0 索引添加新值。我试过 removeAll() 也没有用
    • @user3661552 添加了编辑。但这些都是相当基本的概念,您可以在网络上找到许多更详细地解释这一点的资源(以及一些漂亮的图像)。
    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2014-11-26
    • 2013-05-17
    • 2015-11-29
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多