2013-06-07 3 views
-1

У меня есть 2D-матрица размера nXm, для которой каждая ячейка содержит неизвестное количество значений типа Integer (поэтому я должен использовать Список, чтобы иметь возможность динамически добавлять материал и использовать 2D-массив nXm, потому что массивы легко получить доступ и написать код). PlJava 2D массив ArrayLists

  • легкость, прежде чем рекомендовать мне любую другую структуру данных, ответьте на мой вопрос ниже, а затем обсудить, почему я не должен этого и пойти на то, что вы думаете, будет работать лучше и эффективнее:

Как может Я выделяю память для переменной ниже?

ArrayList<Integer>[][] i2DArrayList; 

Я знаю, что в некоторых случаях я должен это делать. Однако до этого я должен сделать некоторое другое распределение памяти, которое я не помню. Не могли бы вы посоветовать мне в этом вопросе.

for (int i = 0; i < n; i++) { 
      for (int j = 0; j < m; j++) { 
       i2DArrayList[i][j] = new ArrayList<Integer>();  
    } 
} 

Я уже знаю, как сделать это в 1D:

ArrayList<Integer>[] i1DArrayList; 

i1DArrayList = new ArrayList[n]; 
    for (int i = 0; i < i1DArrayList.length; i++) { 
     i1DArrayList[i] = new ArrayList<Integer>(); 
    } 
+1

Я думаю, вам нужен 'ArrayList >'. –

+0

Нет, я сказал, что я в порядке с ArrayList [] [] i2DArrayList –

+0

К сожалению [вы не можете создать массив с общим типом] (http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ104) , Надеюсь, вы закончите с 'ArrayList >', так как это лучший подход для вас. – Pshemo

ответ

1

Просто используйте многомерный инициализатор массива:

ArrayList<Integer>[][] i2DArrayList = new ArrayList<Integer>[n][m]; 

что эквивалентно:

ArrayList<Integer>[][] i2DArrayList = new ArrayList<Integer>[n][]; 
for (int i = 0; i < n; i++) { 
    i2DArrayList[i] = new ArrayList<Integer>[m]; 
} 

Java не позволяет вам выделить общие массивы. То есть вы не можете сделать new T[] или new List<T>[]. Причина в том, что массивы также сохраняют свой тип элемента, чтобы позволить элементам проверки типов во время выполнения. Однако стирание типа удаляет эти общие типы во время компиляции, и поэтому тип допустимого элемента не может быть присвоен new T[] или new List<T>[]. Есть некоторые решения, хотя:

  • Использование некоторых Collection типа для хранения матрицы, а также. Например:

    List<List<List<Integer>>> i2DArrayList = new ArrayList<List<List<Integer>>>(); 
    

    Однако это становится уродливым очень быстро.

  • Вы можете сделать свой собственный, не-универсальный класс входа:

    class Entry { 
        final List<Integer> entries = new ArrayList<Integer>(); 
    } 
    
    Entry[][] i2DArrayList = new Entry[n][m]; 
    
  • Если вы знаете, ваша матрица разрежена, вы можете использовать Map<Position, List<Integer>> вместо этого, с Position класса-значения с x и y полей ,

+0

Это не скомпилируется. –

+0

Проклятье, Java и его дрянные дженерики снова. –

+1

Не проблема дженериков ... –

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