2015-06-19 2 views
4

Я пытаюсь получить доступ к элементам нескольких массивов, которые хранятся в списке массивов. Я могу получить доступ к нему регулярно, но проблема возникает, когда я использую общий тип E для учета разных типов данных. Это дает мне исключение класса. Если я изменю тип tempStart и tempScan и соответствующие приведения к int [] (поскольку это то, что я использую для передачи), он запускается.Как получить доступ к элементам в общем массиве массивов

public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) { 
    if (list.get(0).getClass().isArray()) { 
     System.out.println(" I am an array!"); 
     //go through the arrays and make sure they are 
     //not the same, remove any that are the same 
     //make flag to see if something is different 
     boolean matching; 
     for (int idx = 0; idx < list.size() - 1; idx++) { 
      E[] tempStart =(E[])list.get(idx); 
      for (int k = idx + 1; k < list.size(); k++) { 
       matching = true; 
       E[] tempScan = (E[])list.get(k); 
       for (int index = 0; index < tempStart.length; index++) { 
        if (tempStart[index] != tempScan[index]) { 
         matching = false; 
        } 
       } 
       if (matching) { 
        list.remove(tempScan); 
        k--; 
       } 
      } 
     } 
+0

Ваши циклы для итерации по списку. Вы проверяете, совпадают ли два массива в arraylist, или же элементы внутри массивов, хранящихся у arraylist, одинаковы? – lmcphers

ответ

4

Вы пытаетесь бросить E к E[] и это, очевидно, не является правильным. Попробуйте что-то вроде:

import java.lang.reflect.Array 
... 
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) { 
    ArrayList<E> retList = new ArrayList<>(list.size()); 
    if (list.isEmpty()) return retList; 
    if (list.get(0).getClass().isArray()) { 
     boolean matching; 
     for (int idx = 0; idx < list.size() - 1; ++idx) { 
      E tempStart = list.get(idx); 
      for (int k = idx + 1; k < list.size(); k++) { 
       matching = true; 
       E tempScan = list.get(k); 
       int tempStartLen = Array.getLength(tempStart); 
       for (int index = 0; index < tempStartLen; index++) { 
        if (Array.get(tempScan, index) != Array.get(tempStart, index)) { 
         matching = false; 
        } 
       } 
       if (matching) { 
        list.remove(tempScan); 
        k--; 
       } 
      } 
     } 
     return retList; 
    } else { 
     throw new IllegalArgumentException("List element type expected to be an array"); 
    } 
} 

Однако, поскольку мы используем Java Reflection массив для управления работой массива, используя общий E не имеет смысла здесь. Вы можете просто объявить его как ArrayList<Object>

Обновление: в @afsantos комментарии ниже, тип параметра ArrayList может быть объявлен как ArrayList<?>, как ничего не будет вставить в него.

+0

Параметр 'list' метода может использовать подстановочные знаки, поскольку в него не вставляются никакие элементы:' ArrayList list'. – afsantos

+0

Это сработало! Я работаю над школьным заданием, которое требует от нас работы с родовыми типами, поэтому я был в этой странной ситуации. Спасибо! – cashew

+1

Имейте в виду, что это решение ** НЕ ** - способ работы с типичными типами. На самом деле использование generic с массивом никогда не является хорошей идеей. См. Http://stackoverflow.com/questions/1817524/generic-arrays-in-java –

Смежные вопросы