【问题标题】:Remove elements from 2D array从二维数组中删除元素
【发布时间】:2016-09-07 23:46:32
【问题描述】:

我想从array 中删除routedClients 中的元素,所以我将其转换为ArrayList,然后使用remove,最后将其转换回double[][] 数组。但是当我执行它时,它给了我关于这一行的信息:

double[][] remainingStockout = (double[][]) stockout.toArray();

错误是:

线程“main”中的异常 java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [[Ljava.lang.Double;

任何帮助将不胜感激。 :)

public double[][] removeSite(double[][] array) {

    List<double[]> stockout = new ArrayList<double[]>(Arrays.asList(array));

    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < routedClients.size(); j++) {

            if (array[i][0] == routedClients.get(j)) {

                stockout.remove(i);
            }
        }
    }

    double[][] remainingStockout = (double[][]) stockout.toArray();

    return remainingStockout;

}

【问题讨论】:

  • 您使用的数组似乎是原始类型,请尝试以下代码并确认它是否有效(使用 Double 而不是 double): Double[][] remainingStockout = (Double[][]) stockout.toArray();
  • 它仍然给我一个异常:线程“main”中的异常 java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [[Ljava.lang.Double;
  • 能否调试打印stockout.toArray()返回的类型是什么;

标签: java arrays arraylist multidimensional-array casting


【解决方案1】:

以下似乎有效

double[][] remainingStockout = (double[][]) stockout.toArray(new double[][]{});

完整的测试类:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {
    static ArrayList<Double> routedClients = new ArrayList<Double>();

    public static void main(String[] args) {
        double[][] arr1 = { { 2, 4, 6 }, { 3, 6, 9 }, { 5, 10, 15 } };
        routedClients.add(new Double(1));
        routedClients.add(new Double(2));
        routedClients.add(new Double(3));

        print(arr1);
        double[][] arr2 = removeSite(arr1);
        print(arr2);
    }

    private static void print(double[][] arr1) {
        for (int i = 0; i < arr1.length; i++) {
            double[] arr2 = arr1[i];
            for (int j = 0; j < arr2.length; j++) {
                System.out.println("arr1[" + i + "][" + j + "] = " + arr1[i][j]);
            }
        }
    }


    public static double[][] removeSite(double[][] array) {

        List<double[]> stockout = new ArrayList<double[]>(Arrays.asList(array));
        System.out.println("length before = " + stockout.size());

        for (int i = array.length-1; i >= 0; i--) {
            for (int j = 0; j < routedClients.size(); j++) {
                if (array[i][0] == routedClients.get(j)) {
                    System.out.println("removing " + routedClients.get(j));
                    stockout.remove(i);
                }
            }
        }
        double[][] remainingStockout = (double[][]) stockout.toArray(new double[][] {});
        System.out.println("length after = " + remainingStockout.length);
        return remainingStockout;
    }

}

这是输出

arr1[0][0] = 2.0
arr1[0][1] = 4.0
arr1[0][2] = 6.0
arr1[1][0] = 3.0
arr1[1][1] = 6.0
arr1[1][2] = 9.0
arr1[2][0] = 5.0
arr1[2][1] = 10.0
arr1[2][2] = 15.0
length before = 3
removing 3.0
removing 2.0
length after = 1
arr1[0][0] = 5.0
arr1[0][1] = 10.0
arr1[0][2] = 15.0

【讨论】:

  • 它可以工作,但结果不是我所期望的,例如我在 routedClients 中有 2 和 3,它删除了 2 但它删除了 4 而不是 3。请问这是什么原因造成的?
  • 在外层for循环中逆序进行,因为当你移除一个特定的item时,后面item的索引会减一。我已经更正了我原来帖子中的测试示例
【解决方案2】:

您正在尝试将对象转换为数组。

这是做不到的。

相反,您需要转换数组中的每个元素,然后需要将其添加到 2D 数组中。

以下行将永远无法工作:

double[][] remainingStockout = (double[][]) stockout.toArray();

【讨论】:

    【解决方案3】:

    您可以将双精度数组转换为列表数组,因为编译器只是创建一个包含所有元素的列表,但编译器不知道要创建一个 2D 数组的大小。

    也许您可以尝试创建一个列表列表。不过,您需要再遍历数组两次。一种用于将值分配给嵌套列表,然后在返回值之前再次将它们分配给双精度数组。

    【讨论】:

      【解决方案4】:

      你可以使用 toArray() 的重载方法 .. 像这样 -

      double[][] remainingStockout = new double[array.length][array.length];
      
          stockout.toArray(remainingStockout);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2013-05-16
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        相关资源
        最近更新 更多