Как создать многомерный ArrayList в Java? - PullRequest
29 голосов
/ 09 декабря 2010

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

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

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

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


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

Ответы [ 11 ]

30 голосов
/ 09 декабря 2010

ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();

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

import java.util.ArrayList;

class TwoDimentionalArrayList<T> extends ArrayList<ArrayList<T>> {
    public void addToInnerArray(int index, T element) {
        while (index >= this.size()) {
            this.add(new ArrayList<T>());
        }
        this.get(index).add(element);
    }

    public void addToInnerArray(int index, int index2, T element) {
        while (index >= this.size()) {
            this.add(new ArrayList<T>());
        }

        ArrayList<T> inner = this.get(index);
        while (index2 >= inner.size()) {
            inner.add(null);
        }

        inner.set(index2, element);
    }
}
14 голосов
/ 09 декабря 2010

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

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

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

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

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

11 голосов
/ 09 декабря 2010
3 голосов
/ 04 февраля 2014

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

3 голосов
/ 09 декабря 2010

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

например,

ArrayList<ArrayList<String>> matrix = new ArrayList<ArrayList<String>>();
3 голосов
/ 09 декабря 2010

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

2 голосов
/ 04 декабря 2016

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

import java.util.*;

public class ArrayListMatrix {

    public static void main(String args[]){

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

        ArrayList<Integer> a1 = new ArrayList<Integer>();
        ArrayList<Integer> a2 = new ArrayList<Integer>();
        ArrayList<Integer> a3 = new ArrayList<Integer>();


        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<Integer> 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/

1 голос
/ 31 июля 2018

Кредит идет на Якоба Томао за код.Я только добавил несколько комментариев, чтобы помочь начинающим, таким как я, понять это.Надеюсь, это поможет.

// read about Generic Types In Java & the use of class<T,...> syntax
// This class will Allow me to create 2D Arrays that do not have fixed sizes    
class TwoDimArrayList<T> extends ArrayList<ArrayList<T>> {
    public void addToInnerArray(int index, T element) {
        while (index >= this.size()) {
            // Create enough Arrays to get to position = index
            this.add(new ArrayList<T>()); // (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<T>());// (as if going along Vertical
        }
        //access the inner ArrayList at the "index" position.
        ArrayList<T> 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)
    }
}
0 голосов
/ 22 июня 2019

Здесь ответ для тех, кто хотел бы иметь предварительно инициализированные списки списков. Требуется Java 8 +.

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

class Scratch {

  public static void main(String[] args) {
    int M = 4;
    int N = 3;

    // preinitialized array (== list of lists) of strings, sizes not fixed
    List<List<String>> listOfListsOfString = initializeListOfListsOfT(M, N, "-");
    System.out.println(listOfListsOfString);

    // preinitialized array (== list of lists) of int (primitive type), sizes not fixed
    List<List<Integer>> listOfListsOfInt = initializeListOfListsOfInt(M, N, 7);
    System.out.println(listOfListsOfInt);
  }

  public static <T> List<List<T>> initializeListOfListsOfT(int m, int n, T initValue) {
    return IntStream
        .range(0, m)
        .boxed()
        .map(i -> new ArrayList<T>(IntStream
            .range(0, n)
            .boxed()
            .map(j -> initValue)
            .collect(Collectors.toList()))
        )
        .collect(Collectors.toList());
  }

  public static List<List<Integer>> initializeListOfListsOfInt(int m, int n, int initValue) {
    return IntStream
        .range(0, m)
        .boxed()
        .map(i -> new ArrayList<>(IntStream
            .range(0, n)
            .map(j -> initValue)
            .boxed()
            .collect(Collectors.toList()))
        )
        .collect(Collectors.toList());
  }
}

Выход:

[[-, -, -], [-, -, -], [-, -, -], [-, -, -]]
[[7, 7, 7], [7, 7, 7], [7, 7, 7], [7, 7, 7]]

Примечание для тех, кто интересуется IntStream:

IntStream
    .range(0, m)
    .boxed()

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

Stream
    .iterate(0, j -> j + 1)
    .limit(n)
0 голосов
/ 09 апреля 2019

Вы также можете сделать что-то вроде этого ...

  • Сначала создайте и инициализируйте матрицу или многомерный массив

    ArrayList<ArrayList<Integer>> list; MultidimentionalArrayList(int x,int y) { list = new ArrayList<>(); for(int i=0;i<=x;i++) { ArrayList<Integer> temp = new ArrayList<>(Collections.nCopies(y+1,0)); list.add(temp); } }

    • Добавить элемент в определенную позицию void add(int row,int column,int val) { list.get(row).set(column,val); // list[row][column]=val }

    Эта статическая матрица может быть преобразована в динамическую, если проверить, что строка и столбец выходят за границы.просто вставьте дополнительный временный массив для строки

    • удалить элемент

    int remove(int row, int column) { return list.get(row).remove(column);// del list[row][column] }

...