ti-enxame.com

Java ArrayList of Arrays?

Eu quero criar uma matriz dimensional mutli sem um tamanho fixo.

Eu preciso ser capaz de adicionar itens de String[2] a ele.

Eu tentei olhar para:

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

mas isso não funciona. alguém tem outras idéias?

43
Rumpleteaser

Deveria estar

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

Você não pode especificar o tamanho da matriz dentro do parâmetro genérico; adicione apenas matrizes de tamanho específico à lista posteriormente. Isso também significa que o compilador não pode garantir que todas as sub-matrizes sejam do mesmo tamanho; isso deve ser garantido por você.

Uma solução melhor pode ser encapsular isso dentro de uma classe, na qual você pode garantir o tamanho uniforme das matrizes como um tipo invariável.

70
Péter Török

Entre. você deve preferir codificar contra uma interface.

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

Deveria estar

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

Como o tamanho da sua matriz de strings é fixo em tempo de compilação, é melhor usar uma estrutura (como Pair) que exige exatamente dois campos e, assim, evita os erros de tempo de execução possíveis com a abordagem de array.

Código:

Como Java não fornece uma classe Pair, você precisará definir sua própria.

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'
  //
}

e depois use-o como:

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

[Aqui eu usei List porque é considerado uma boa prática programar para interfaces. ]

4
missingfaktor

Como já foi respondido, você pode criar um ArrayList de String Arrays como @ Péter Török escrito;

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

Ao atribuir matrizes de seqüência de caracteres diferentes a este ArrayList, o comprimento de cada matriz de seqüência de caracteres será diferente.

No exemplo a seguir, foram adicionadas 4 matrizes diferentes de strings, seus comprimentos variam.

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

O código de demonstração é como abaixo;

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();
        }

    }
}

E a saída é a seguinte;

 $ 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

Notifique também que você pode inicializar uma nova Matriz de Sting como abaixo;

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

Então, isso é o mesmo com;

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

Eu escrevi essa demonstração apenas para mostrar que nenhum objeto ArrayList, todos os elementos são referências a instanciações diferentes de String Arrays, portanto, o comprimento de cada String Arrays não precisa ser o mesmo, nem é importante.

ma última observação: será uma prática recomendada usar o ArrayList em uma interface de Lista, em vez da qual você usou em sua pergunta.

Será melhor usar a interface da lista como abaixo;

    //Declaration of an ArrayList of String Arrays
    List<String[]> listOfArrayList = new ArrayList<String[]>();
3
Levent Divilioglu
ArrayList<String[]> action = new ArrayList<String[]>();

Não precisa de String[2];

3
Koerr

Isso funciona muito bem.

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]);

O resultado será

Borkala
0
ZBorkala