2016-09-07 3 views
0

Я хочу, чтобы удалить элементы, которые находятся в routedClients от array, поэтому я преобразовал его в ArrayList, затем использовал remove, в конце концов я преобразовал его обратно в double[][] массив. Но когда я исполню его, он дает мне это сообщение об этой линии:Удалить элементы из 2D массива

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

Ошибка:

Исключение в потоке «основного» 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; 

} 
+1

Массив, который вы использовали, по-видимому, имеет примитивный тип, попробуйте ввести код ниже и подтвердите, работает ли он (используйте Double вместо double): Двойной [] [] ОсталосьStockout = (Двойной [] []) outout.toArray(); – amitmah

+0

Он по-прежнему дает мне исключение: Исключение в потоке «main» java.lang.ClassCastException: [Ljava.lang.Object; не может быть применено к [[Ljava.lang.Double; –

+0

Можете ли вы отлаживать и распечатывать то, что является типом, возвращаемым else.toArray(); – amitmah

ответ

2

Ниже, кажется, работает

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 
+0

Он работает, спасибо вам большое !!!! –

+0

Он работает, но результаты не то, что я ожидал, например, у меня есть 2 и 3 в routedClients, он удаляет 2, но он удаляет 4 вместо 3. пожалуйста, что может вызвать это? –

+0

Идите в обратном порядке во внешнем цикле, потому что когда вы удаляете определенный элемент, индекс следующих элементов уменьшается на единицу. Я исправил тестовый пример в своем оригинальном посте – Harry

1

Вы пытаетесь передать объект в массив.

Это невозможно.

Вместо этого вам нужно будет преобразовать каждый элемент в массив, а затем добавить его в 2D-массив.

Следующая строка никогда не будет работать:

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

Вы можете бросить двойной массив в массив списка, потому что компилятор просто делает список всех элементов, но компилятор не может знать, какой размер сделать 2D-массив.

Возможно, вы могли бы попытаться создать список списков. Однако вам нужно будет проходить ваш массив еще два раза. Один для назначения значений вложенному списку, а затем для повторного присваивания их двойному массиву перед возвратом значения.

0

вы можете использовать перегруженный метод ToArray() .. как это -

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

    stockout.toArray(remainingStockout); 
Смежные вопросы