Java 从二维数组中删除元素

Java 从二维数组中删除元素,java,arrays,arraylist,multidimensional-array,casting,Java,Arrays,Arraylist,Multidimensional Array,Casting,我想从array中删除routedClients中的元素,因此我将其转换为ArrayList,然后使用remove,最后将其转换回double[][数组。但当我执行它时,它会给我关于这行的信息: double[][] remainingStockout = (double[][]) stockout.toArray(); 错误是: 线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.Object;无法转换为[[Ljava.lang.Doub

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

double[][] remainingStockout = (double[][]) stockout.toArray();
错误是:

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

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

public double[]]removeSite(双[]]array){
List stockout=newarraylist(Arrays.asList(array));
for(int i=0;i
您正在尝试将对象强制转换为数组

这是不可能做到的

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

以下行永远不会起作用:

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

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

这是不可能做到的

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

以下行永远不会起作用:

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

可以将双数组强制转换为列表数组,因为编译器只生成包含所有元素的列表,但编译器不知道生成2D数组的大小


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

您可以将双数组强制转换为列表数组,因为编译器只生成包含所有元素的列表,但是编译器无法知道生成2D数组的大小


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

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

double[][] remainingStockout = new double[array.length][array.length];

    stockout.toArray(remainingStockout);

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

double[][] remainingStockout = new double[array.length][array.length];

    stockout.toArray(remainingStockout);

下面的方法似乎有效

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;
    }

}

下面的方法似乎有效

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;
    }

}

您使用的数组似乎是基元类型,请尝试下面的代码并确认它是否有效(使用Double而不是Double):Double[]]remainingStockout=(Double[]])stockout.toArray();它仍然会给我一个异常:线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.Object;无法转换为[[Ljava.lang.Double;您能调试并打印stockout.toArray()返回的类型吗;您使用的数组似乎是基元类型,请尝试下面的代码并确认它是否有效(使用Double而不是Double):Double[][]remainingStockout=(Double[]])stockout.toArray();它仍然给我一个异常:线程“main”中的异常java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为[[Ljava.lang.Double;是否可以调试并打印stockout.toArray()返回的类型;它可以工作,但结果不是我预期的,例如,我在RoutedClient中有2和3,它删除了2,但删除了4,而不是3。请说明是什么原因造成的?在外部for循环中按相反顺序进行,因为当您删除特定项时,以下项的索引将减少1。我已在我的orig中更正了测试示例inal postIt可以工作,但结果不是我预期的,例如,我在RoutedClient中有2和3,它删除了2,但删除了4而不是3。请说明是什么原因造成的?在外部for循环中按相反顺序进行,因为当您删除特定项时,以下项的索引会减少1。我已在中更正了测试示例我原来的帖子