Java ArrayList из массивов? - PullRequest
       14

Java ArrayList из массивов?

43 голосов
/ 04 сентября 2010

Я хочу создать многомерный массив без фиксированного размера.

Мне нужно иметь возможность добавлять к нему элементы String[2].

Я пытался посмотреть на:

private ArrayList<String[]> action = new ArrayList<String[2]>();

но это не работает.у кого-нибудь есть другие идеи?

Ответы [ 7 ]

70 голосов
/ 04 сентября 2010

Должно быть

private ArrayList<String[]> action = new ArrayList<String[]>();
action.add(new String[2]);
...

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

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

12 голосов
/ 04 сентября 2010

КСТАТИ. Вы должны предпочесть кодирование для интерфейса.

private ArrayList<String[]> action = new ArrayList<String[]>();

Должно быть

private List<String[]> action = new ArrayList<String[]>();
4 голосов
/ 04 сентября 2010

Поскольку размер вашего строкового массива фиксирован во время компиляции, вам лучше использовать структуру (например, Pair), которая требует ровно два поля и, таким образом, избегает ошибок времени выполнения, возможных при использовании массива.

Код:

Поскольку Java не предоставляет класс Pair, вам необходимо определить свой собственный.

class Pair<A, B> {
  public final A first;
  public final B second;

  public Pair(final A first, final B second) {
    this.first = first;
    this.second = second;
  }

  //
  // Override 'equals', 'hashcode' and 'toString'
  //
}

изатем используйте его как:

List<Pair<String, String>> action = new ArrayList<Pair<String, String>>();

[Здесь я использовал List, потому что считается хорошей практикой для программирования интерфейсов.]

3 голосов
/ 23 июня 2015

Как уже было сказано, вы можете создать ArrayList из String Arrays в виде написанного @Péter Török;

    //Declaration of an ArrayList of String Arrays
    ArrayList<String[]> listOfArrayList = new ArrayList<String[]>();

При назначении разных String Arrays этому ArrayList длина каждого String Array будет разной.

В следующем примере добавлены 4 различных массива строк, их длины различны.

String Array #1: len: 3
String Array #2: len: 1
String Array #3: len: 4
String Array #4: len: 2

Код демонстрации такой, как показано ниже;

import java.util.ArrayList;

public class TestMultiArray {

    public static void main(String[] args) {
        //Declaration of an ArrayList of String Arrays
        ArrayList<String[]> listOfArrayList = new ArrayList<String[]>();

        //Assignment of 4 different String Arrays with different lengths
        listOfArrayList.add( new String[]{"line1: test String 1","line1: test String 2","line1: test String 3"}  );
        listOfArrayList.add( new String[]{"line2: test String 1"}  );
        listOfArrayList.add( new String[]{"line3: test String 1","line3: test String 2","line3: test String 3", "line3: test String 4"}  );
        listOfArrayList.add( new String[]{"line4: test String 1","line4: test String 2"}  );

        // Printing out the ArrayList Contents of String Arrays
        // '$' is used to indicate the String elements of String Arrays
        for( int i = 0; i < listOfArrayList.size(); i++ ) {
            for( int j = 0; j < listOfArrayList.get(i).length; j++ )
                System.out.printf(" $ " + listOfArrayList.get(i)[j]);

            System.out.println();
        }

    }
}

И выводследует;

 $ line1: test String 1 $ line1: test String 2 $ line1: test String 3
 $ line2: test String 1
 $ line3: test String 1 $ line3: test String 2 $ line3: test String 3 $ line3: test String 4
 $ line4: test String 1 $ line4: test String 2

Также оповестите, что вы можете инициализировать новый массив Sting, как показано ниже:

new String[]{ str1, str2, str3,... }; // Assuming str's are String objects

То же самое относится к;

String[] newStringArray = { str1, str2, str3 }; // Assuming str's are String objects

IМы написали эту демонстрацию просто для того, чтобы показать, что нет объекта ArrayList , все элементы являются ссылками на различные экземпляры String Arrays, поэтому длина каждого String Arrays не обязательно должна быть одинаковой, равно как иважно.

Последнее замечание : Лучше всего использовать ArrayList в интерфейсе List вместо того, который вы использовали в своем вопросе.

Будет лучше использовать интерфейс списка, как показано ниже;

    //Declaration of an ArrayList of String Arrays
    List<String[]> listOfArrayList = new ArrayList<String[]>();
3 голосов
/ 04 сентября 2010
ArrayList<String[]> action = new ArrayList<String[]>();

Не нужно String[2];

0 голосов
/ 28 апреля 2019

Это работает очень хорошо.

ArrayList<String[]> a = new ArrayList<String[]>();
    a.add(new String[3]);
    a.get(0)[0] = "Zubair";
    a.get(0)[1] = "Borkala";
    a.get(0)[2] = "Kerala";
System.out.println(a.get(0)[1]);

Результат будет

Borkala
0 голосов
/ 04 сентября 2010
  1. Создайте ArrayList как ArrayList action.

    В JDK 1.5 или выше используйте ArrayList <string[]> ссылочное имя.

    В JDK 1.4 или ниже используйте ArrayList ссылочное имя.

  2. Укажите спецификаторы доступа:

    • публично, можно получить доступ куда угодно
    • частный доступ к классу
    • защищенный, доступ к нему внутри класса и различные подклассы пакета
  3. Затем укажите ссылку, которой она будет присвоена в

    action = new ArrayList<String[]>();
    
  4. В JVM ключевое слово new выделит память во время выполнения для объекта.

    Вам не следует присваивать значение там, где оно объявлено, потому что вы спрашиваете без фиксированного размера.

  5. Наконец, вы можете использовать метод add() в ArrayList. Используйте как

    action.add(new string[how much you need])
    

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

...