java 多维数组列表

标签 java arrays arraylist multidimensional-array

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

这是我的输出:

[0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 添加 0 后 [0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 加 1 后 [0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 添加 2 后 [0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 添加 3 后 [0.4, 0.42, 0.4, 1.2200000000000002, 0.0010000000000000009] 添加 4 后 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 添加 0 后 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 加 1 后 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 加 2 后 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 添加 3 后 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 添加 4 后 [0.4, 0.42, 0.42, 1.24, 0.01200000000000001] 添加 5 后 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 0 后 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 1 后 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 2 后 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 3 后 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 4 后 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加 5 后 [0.4, 0.44, 0.4, 1.2400000000000002, 0.011999999999999983] 添加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);

最佳答案

您始终将列表的相同实例添加到列表中。这意味着最终 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);

然后您只需将引用添加到workMatrix列表中。此引用仍然引用您创建的唯一实例:

// 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);

关于java 多维数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788496/

相关文章:

javascript - 我正在尝试将图像从数组添加到我的 flickity 轮播中并使用 for 循环

java - 在 Hibernate 返回的列表上调用 List#toArray() 时出现 ArrayStoreException

java - 将对象添加到 Arraylist 并在方法外部使用它

java - 从泛型 ArrayList 派生泛型类型

java - java中如何定义字符串数组中的特殊字符

java - Android InputStream 无法接收来自蓝牙 HC-05 的完整消息

java - 如何在 android 中使用 Room Persistence ORM 工具实现 created_at 和 updated_at 列

java - Spring MVC 页面 HTTP 状态 400 和不正确的 URL

java - Android 滑动选项卡 - 修改示例项目

python - 找到所有接近目标的值,如 numpy.searchsorted() 但返回所有相同的值?