2010-09-04 20 views
35

Ich möchte ein multidimensionales Array ohne feste Größe erstellen.Java ArrayList von Arrays?

Ich muss in der Lage sein, Elemente von String[2] zu ihm hinzuzufügen.

ich versucht habe, sich bei:

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

aber das funktioniert nicht. Hat jemand noch andere Ideen?

Antwort

66

sein

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

Sie nicht die Größe des Arrays innerhalb der generischen Parameter angeben können, nur Arrays mit einer bestimmten Größe hinzufügen später in die Liste. Das bedeutet auch, dass der Compiler nicht garantieren kann, dass alle Sub-Arrays die gleiche Größe haben, muss von Ihnen sichergestellt werden.

Eine bessere Lösung könnte darin bestehen, dies innerhalb einer Klasse zu kapseln, wo Sie die einheitliche Größe der Arrays als Typinvariante sicherstellen können.

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

Nicht benötigt String[2]; Sollte

-1
  1. Erstellen Sie die ArrayList wie ArrayList action.

    In JDK 1.5 oder höher verwenden Sie ArrayList <string[]> Referenzname.

    In JDK 1.4 oder niedriger verwenden Sie ArrayList Referenzname.

  2. Geben Sie die Zugriffsbezeich:

    • Öffentlichkeit, kann überall zugegriffen werden
    • privat, innerhalb der Klasse zugegriffen
    • geschützt
    • , innerhalb der Klasse zugegriffen und verschiedene Paketunterklassen
  3. Geben Sie dann die Referenz an, der sie in

    zugewiesen wird
    action = new ArrayList<String[]>(); 
    
  4. In JVM new Schlüsselwort wird Speicher in Laufzeit für das Objekt reservieren.

    Sie sollten den angegebenen Wert nicht angeben, da Sie ohne feste Größe fragen.

  5. Schließlich können Sie die add() Methode in ArrayList verwenden. Verwendung wie

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

    Es wird den spezifischen Speicherbereich in Heap zuordnen.

10

BTW. Sie sollten lieber mit einem Interface codieren.

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

Sollte

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

+1 vereinbart. Auch sollte es normalerweise endgültig erklärt werden. Es gibt nur sehr wenige Anwendungsfälle für das erneute Binden einer Containervariablen. – dsmith

+0

Warum ist das so? – athena

+2

@athena: Siehe die erste Frage und ihre Antwort in diesem Erich Gamma Interview: http://goo.gl/fz9G – missingfaktor

4

Da die Größe der String-Array bei der Kompilierung festgelegt ist, dann würden Sie besser mit einer Struktur (wie Pair), dass Mandate genau zwei Felder, und somit sein Vermeiden Sie die Laufzeitfehler, die mit dem Array-Ansatz möglich sind.

Code:

Da Java keine Pair Klasse liefern, müssen Sie Ihre eigene definieren.

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

und verwenden sie dann als:

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

[Hier verwendete ich List weil es eine gute Praxis betrachtet hat Schnittstellen zu programmieren. ]

+1

+1 Ich war gerade dabei, genau die gleiche Antwort zu geben.Es gab viele Diskussionen darüber, ob eine java.util.Pair-Klasse benötigt wird. Ich denke ja. – dsmith

+0

Bis zu einem gewissen Grad einverstanden - eine Pair-Klasse, die Sie zur Verfügung gestellt haben, ist ein guter Anfang und ist eine schöne Verallgemeinerung, da ich finde, dass Sammlungen/Arrays, die andere Collections/Arrays enthalten, ein Code-Geruch ist. In diesem Fall ist es jedoch sehr wahrscheinlich, dass die beiden Strings, die das OP zusammenstellt, wahrscheinlich eine besondere Beziehung zueinander haben und in diesem Fall wahrscheinlich eine eigene Klasse verdienen, die diese Beziehung spezifiziert (und Methoden enthält, die spezifisch für das sind) Paar). Es könnte natürlich eine Unterklasse von Pair sein. – whaley

+0

Java hat java.util.Map.Pair. Keine Notwendigkeit, ur eigene zu definieren. – emory

3

Wie bereits beantwortet, können Sie eine ArrayList von String Arrays als @ Péter Török geschrieben erstellen;

Wenn Sie dieser ArrayList verschiedene String-Arrays zuweisen, ist die Länge jedes String-Arrays unterschiedlich.

Im folgenden Beispiel wurden 4 verschiedene Array of String hinzugefügt, deren Längen variieren.

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

Der Demonstrationscode ist wie folgt;

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

    } 
} 

Und der Ausgang ist wie folgt;

$ 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 

Benachrichtigen Sie auch, dass Sie ein neues Array of Sting wie unten beschrieben initialisieren können;

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

Also das ist das gleiche mit;

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

ich diese Demonstration geschrieben habe nur um zu zeigen, dass keine der Arraylist Objekt, alle Elemente Verweise auf verschiedene Ausprägungen von String-Arrays sind, so dass die Länge der einzelnen String-Arrays sind nicht gleich sein müssen, es ist auch nicht wichtig.

Eine letzte Anmerkung: Es wird empfohlen, die ArrayList innerhalb einer List-Oberfläche zu verwenden, anstatt sie in Ihrer Frage zu verwenden.

Es wird besser sein, die List-Schnittstelle wie folgt zu verwenden;

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