Как создать multidimensional array ArrayList в Java?

Я все равно новичок в ArrayLists, но мне нужен их для этого проекта. Я делаю это, если вы, ребята, могли бы мне помочь, я был бы более чем благодарен!
В принципе, мне нужно создать многомерный ArrayList для хранения значений String. Я знаю, как это сделать со стандартным массивом, так что public static String[][] array = {{}} но это не хорошо, потому что я не знаю размер моего массива, все, что я знаю, это будет иметь.

Итак, если вы, ребята, знаете, как сделать «динамически изменяемый массив с 2 / + demensions», пожалуйста, не могли бы вы рассказать мне.

Заранее спасибо,
Энди

Редактировать / Update


Может быть, было бы проще resize или определить стандартный массив с помощью varible? Но я не знаю?
Вероятно, проще использовать мою оригинальную идею ArrayList, хотя … Все, что мне нужно, это полный примерный код для создания 2D ArrayList и добавление таких примерных значений в оба измерения без знания индекса.

ArrayList> array = new ArrayList>();

В зависимости от ваших требований вы можете использовать class Generic, подобный приведенному ниже, чтобы облегчить доступ:

 import java.util.ArrayList; class TwoDimentionalArrayList extends ArrayList> { public void addToInnerArray(int index, T element) { while (index >= this.size()) { this.add(new ArrayList()); } this.get(index).add(element); } public void addToInnerArray(int index, int index2, T element) { while (index >= this.size()) { this.add(new ArrayList()); } ArrayList inner = this.get(index); while (index2 >= inner.size()) { inner.add(null); } inner.set(index2, element); } } 

Если вам разрешено использовать предопределенные classы Java, вы можете сделать что-то вроде:

 private static ArrayList> biDemArrList = new ArrayList>(); 

Затем вы можете добавить новые элементы, например:

 ArrayList temp = new ArrayList(); // added () temp.add("Hello world."); biDemArrList.add(temp); 

Надеюсь, вы поймете, что я имею в виду и что происходит. Кроме того, вам нужно будет импортировать java.util.ArrayList; для этого, если вы используете class Java.

Вы можете иметь ArrayList с элементами, которые будут самими ArrayLists.

Я могу думать о Array внутри массива или MultiMap от Guava ?

например

 ArrayList> matrix = new ArrayList>(); 

Не будет List> 2dlist = new ArrayList>(); быть более эффективной (более эффективной) реализацией?

Как только мне понадобилось 2-D arrayList, и я создал с помощью List и ArrayList, и код выглядит следующим образом:

 import java.util.*; public class ArrayListMatrix { public static void main(String args[]){ List> a = new ArrayList<>(); ArrayList a1 = new ArrayList(); ArrayList a2 = new ArrayList(); ArrayList a3 = new ArrayList(); a1.add(1); a1.add(2); a1.add(3); a2.add(4); a2.add(5); a2.add(6); a3.add(7); a3.add(8); a3.add(9); a.add(a1); a.add(a2); a.add(a3); for(ArrayList obj:a){ ArrayList temp = obj; for(Integer job : temp){ System.out.print(job+" "); } System.out.println(); } } } 

Вывод:

1 2 3

4 5 6

7 8 9

Источник: https://www.codepuran.com/java/2d-matrix-arraylist-collection-class-java/

Кредит для JAcob Tomao для кода. Я только добавил некоторые комментарии, чтобы помочь новичкам, как я, это понять. Я надеюсь, что это помогает.

 // read about Generic Types In Java & the use of class syntax // This class will Allow me to create 2D Arrays that do not have fixed sizes class TwoDimArrayList extends ArrayList> { public void addToInnerArray(int index, T element) { while (index >= this.size()) { // Create enough Arrays to get to position = index this.add(new ArrayList()); // (as if going along Vertical axis) } // this.get(index) returns the Arraylist instance at the "index" position this.get(index).add(element); // (as if going along Horizontal axis) } public void addToInnerArray(int index, int index2, T element) { while (index >= this.size()) { this.add(new ArrayList());// (as if going along Vertical } //access the inner ArrayList at the "index" position. ArrayList inner = this.get(index); while (index2 >= inner.size()) { //add enough positions containing "null" to get to the position index 2 .. //.. within the inner array. (if the requested position is too far) inner.add(null); // (as if going along Horizontal axis) } //Overwrite "null" or "old_element" with the new "element" at the "index 2" .. //.. position of the chosen(index) inner ArrayList inner.set(index2, element); // (as if going along Horizontal axis) } } 

Что вы думаете об этом для 3D ArrayList – можно использовать аналогично массивам – см. Комментарии в коде:

  import java.util.ArrayList; import java.util.List; /** * ArrayList3D simulates a 3 dimensional array,
* eg: myValue = arrayList3D.get(x, y, z) is the same as:
* myValue = array[x][y][z]
* and
* arrayList3D.set(x, y, z, myValue) is the same as:
* array[x][y][z] = myValue;
* but keeps its full ArrayList functionality, thus its * benefits of ArrayLists over arrays.
*
* @param data type */ public class ArrayList3D { private final List>> arrayList3D; public ArrayList3D() { arrayList3D = newArrayDim1(); } /** * Get value of the given array element.
* Eg: get(2, 5, 3);
* For 3 dim array this would equal to:
* nyValue = array[2][5][3];
*
* Throws: IndexOutOfBoundsException * - if any index is out of range * (index < 0 || index >= size())
*
* @param dim1 index of the first dimension of the array list * @param dim2 index of the second dimension of the array list * @param dim3 index of the third dimension of the array list * @return value of the given array element (of type T) */ public T get(int dim1, int dim2, int dim3) { List> ar2 = arrayList3D.get(dim1); List ar3 = ar2.get(dim2); return ar3.get(dim3); } /** * Set value of the given array.
* Eg: set(2, 5, 3, "my value");
* For 3 dim array this would equal to:
* array[2][5][3]="my value";
*
* Throws: IndexOutOfBoundsException * - if any index is out of range * (index < 0 || index >= size())
*
* @param dim1 index of the first dimension of the array list * @param dim2 index of the second dimension of the array list * @param dim3 index of the third dimension of the array list * @param value value to assign to the given array *
*/ public void set(int dim1, int dim2, int dim3, T value) { arrayList3D.get(dim1).get(dim2).set(dim3, value); } /** * Set value of the given array element.
* Eg: set(2, 5, 3, "my value");
* For 3 dim array this would equal to:
* array[2][5][3]="my value";
*
* Throws: IndexOutOfBoundsException * - if any index is less then 0 * (index < 0)
*
* @param indexDim1 index of the first dimension of the array list * @param indexDim2 index of the second dimension of the array list * If you set indexDim1 or indexDim2 to value higher * then the current max index, * the method will add entries for the * difference. The added lists will be empty. * @param indexDim3 index of the third dimension of the array list * If you set indexDim3 to value higher * then the current max index, * the method will add entries for the * difference and fill in the values * of param. 'value'. * @param value value to assign to the given array index */ public void setOrAddValue(int indexDim1, int indexDim2, int indexDim3, T value) { List
ar3 = setOrAddDim3(indexDim1, indexDim2); int max = ar3.size(); if (indexDim3 < 0) indexDim3 = 0; if (indexDim3 < max) ar3.set(indexDim3, value); for (int ix = max-1; ix < indexDim3; ix++ ) { ar3.add(value); } } private List>> newArrayDim1() { List ar3 = new ArrayList<>(); List> ar2 = new ArrayList<>(); List>> ar1 = new ArrayList<>(); ar2.add(ar3); ar1.add(ar2); return ar1; } private List> newArrayDim2() { List ar3 = new ArrayList<>(); List> ar2 = new ArrayList<>(); ar2.add(ar3); return ar2; } private List newArrayDim3() { List ar3 = new ArrayList<>(); return ar3; } private List> setOrAddDim2(int indexDim1) { List> ar2 = null; int max = arrayList3D.size(); if (indexDim1 < 0) indexDim1 = 0; if (indexDim1 < max) return arrayList3D.get(indexDim1); for (int ix = max-1; ix < indexDim1; ix++ ) { ar2 = newArrayDim2(); arrayList3D.add(ar2); } return ar2; } private List setOrAddDim3(int indexDim1, int indexDim2) { List> ar2 = setOrAddDim2(indexDim1); List ar3 = null; int max = ar2.size(); if (indexDim2 < 0) indexDim2 = 0; if (indexDim2 < max) return ar2.get(indexDim2); for (int ix = max-1; ix < indexDim2; ix++ ) { ar3 = newArrayDim3(); ar2.add(ar3); } return ar3; } public List>> getArrayList3D() { return arrayList3D; } }

И вот тестовый код:

  ArrayList3D ar = new ArrayList3D<>(); int max = 3; for (int i1 = 0; i1 < max; i1++) { for (int i2 = 0; i2 < max; i2++) { for (int i3 = 0; i3 < max; i3++) { ar.setOrAddValue(i1, i2, i3, (i3 + 1) + (i2*max) + (i1*max*max)); int x = ar.get(i1, i2, i3); System.out.println(" - " + i1 + ", " + i2 + ", " + i3 + " = " + x); } } } 

Результат:

  • 0, 0, 0 = 1
  • 0, 0, 1 = 2
  • 0, 0, 2 = 3
  • 0, 1, 0 = 4
  • 0, 1, 1 = 5
  • 0, 1, 2 = 6
  • 0, 2, 0 = 7
  • 0, 2, 1 = 8
  • 0, 2, 2 = 9
  • 1, 0, 0 = 10
  • 1, 0, 1 = 11
  • 1, 0, 2 = 12
  • 1, 1, 0 = 13
  • 1, 1, 1 = 14
  • 1, 1, 2 = 15
  • 1, 2, 0 = 16
  • 1, 2, 1 = 17
  • 1, 2, 2 = 18
  • 2, 0, 0 = 19
  • 2, 0, 1 = 20
  • 2, 0, 2 = 21
  • 2, 1, 0 = 22
  • 2, 1, 1 = 23
  • 2, 1, 2 = 24
  • 2, 2, 0 = 25
  • 2, 2, 1 = 26
  • 2, 2, 2 = 27
Interesting Posts

Как показать список установленных приложений в списке без флажка, который не проверяется при прокрутке списка?

Наследование и агрегирование

Где $ PATH устанавливается в OS X 10.6 Snow Leopard?

Не удалось открыть соединение с вашим агентом аутентификации

Самый простой способ поддержки нескольких ориентаций? Как загрузить пользовательский NIB, когда приложение находится в Landscape?

Использование Process Monitor для отслеживания изменений реестра

Некоторые настольные приложения Windows 8.1 не запускаются

C # – как определить, является ли тип числом

Как заставить обновление favicon?

В чем разница между атрибутом и собственностью?

Eclipse не выделяет совпадающие переменные

Изменение поведения отступа Vim по типу файла

Android Studio – исключение mergeDebugResources

Правильный способ утилиты Image / Bitmap и PictureBox

Использует ли Tor запрет моему ISP / sysadmin видеть, какие сайты я посещаю?

Давайте будем гением компьютера.