2016-05-06 15 views
0

Ich möchte Erstellen einer Arraylist-Matrix mit n-Zeilen und m-Spalten erstellen, zum Beispieleine Matrix mit Arraylisten

1 2 3 4 5 

    1 2 3 4 5 

    1 2 3 4 5 

    1 2 3 4 5 

    1 2 3 4 5 

Ich habe bereits einen Code für die Schaffung einer solchen Matrix, aber mein Code doesn geschrieben Die Werte werden nicht angezeigt, wenn ich die Liste mit den Spaltendaten lösche. Hier ist meine

package testproject; 

import java.util.ArrayList; 

public class TestProject { 

    public static void main(String[] args) { 
     ArrayList<Integer> intList = new ArrayList<>(); 
     ArrayList<ArrayList<Integer>> mainList = new ArrayList<>(); 
     for (int i = 0; i < 10; i++) { 
      for (int k = 0; k < 5; k++) { 
       intList.add(k); 
      } 
      mainList.add(intList); 
      intList.clear(); //this line is probably the problem 
     } 
     for (int row = 0; row < mainList.size(); row++) { 
      for (int col = 0; col < mainList.get(0).size(); col++) { 
       System.out.print(mainList.get(row).get(col) + ","); 
      } 
      System.out.println(""); 
     } 
    } 
} 

Gibt es eine Möglichkeit, den Inhalt von intList zu löschen, ohne die Inhalt Mainlist Clearing ??

+0

Konnte man nicht einfach eine neue ArrayList deklarieren newList = new ArrayList (intList); Fügen Sie das dann der Hauptliste statt der IntListe hinzu? – Orin

Antwort

1

Wenn mainList.add(intList); Aufruf Sie das Hinzufügen eines Verweises zeigt auf dem intList Objekt in Ihre Mainlist anstatt die Werte zu kopieren. Sie müssen eine Instanz von "intList" pro Zeile erstellen und nichts löschen.

+0

sandBo00 Ich sehe ... die Erstellung einer Instanz für jede Zeile würde wahrscheinlich die Leistung bei höheren Zeilenmengen (> = 100000) zerstören. – Ramses

+0

@Ramses Ich habe gerade mit 120000 Zeilen und 10 Spalten getestet, jede Position mit einer zufälligen Ganzzahl gefüllt, und das dauerte fast keine Zeit auf meinem Rechner ;-) – sandbo00

0

Ich würde n- oder m- ArrayLists erstellen, es hängt davon ab, wie Sie es verwenden möchten.

Oder Sie erstellen eine hashmap> für jede Zeile eine ArrayList.

1

Sie müssen nur die Erstellung von intList für for-Schleife verschieben und jetzt sollte funktionieren.

import java.util.ArrayList; 
     public class TestProject { 
      public static void main(String[] args) { 
       ArrayList<ArrayList<Integer>> mainList = new ArrayList<>(); 
       for(int i=0;i<10;i++) { 
        ArrayList<Integer> intList = new ArrayList<>(); 
        for(int k=0;k<5;k++) { 
         intList.add(k); 
        } 
        mainList.add(intList); 
       } 
       for(int row=0;row<mainList.size();row++) { 
        for(int col=0;col<mainList.get(0).size();col++) { 
         System.out.print(mainList.get(row).get(col)+","); 
        } 
        System.out.println(""); 
       } 
      } 
     } 
+1

Sie müssen die Zeile "intList.clear();" entfernen, sonst sind die Listen weiterhin leer. – sandbo00

+0

@Maxqueue Ihre Lösung funktioniert nur, wenn Sie die Zeile löschen intList.clear() :-) – Ramses

+1

Ja, verpasst, dass. – Maxqueue

1

Ja, Ihre Vermutung ist richtig. die Linie intList.clear(); ist das Problem. Da die intList in mainList gespeichert ist und wenn Sie intList löschen die Informationen in mainList auch verloren geht. eine Lösung: Erstellen Sie eine new intList in jeder Schleife Aber weil Matrizen sind in der Regel nicht variabel in ihren Dimensionen - die Arraylists sind - sollten Sie in Betracht ziehen, int[][] intList für Ihre Matrizen verwenden.

1

Java arbeitet mit Referenzen. In Ihrem Programm wird mainList 5 Referenzen auf die gleiche eindeutige intList enthalten. Alles, was Sie zu tun intList reflektiert in allen „Reihen“ in mainList, Clearing, einen Wert zu ändern, usw.

Wenn Sie eine Matrix Sie wahrscheinlich jede „Zeile“ haben wollen, erstellen wollen sein ein Verweis auf eine andere Liste.

package testproject; 

import java.util.ArrayList; 

public class TestProject { 

    public static void main(String[] args) { 
     ArrayList<ArrayList<Integer>> mainList = new ArrayList<>(); 
     for (int i = 0; i < 10; i++) { 
      ArrayList<Integer> intList = new ArrayList<>(); // This creates a new list for each row. 
      for (int k = 0; k < 5; k++) { 
       intList.add(k); 
      } 
      mainList.add(intList); 
     } 
     for (int row = 0; row < mainList.size(); row++) { 
      for (int col = 0; col < mainList.get(0).size(); col++) { 
       System.out.print(mainList.get(row).get(col) + ","); 
      } 
      System.out.println(""); 
     } 
    } 
} 

In Ihrem Programm die Zwischen Liste Löschen nicht notwendig ist: Dies kann durch Instanziieren eine neue Liste in der Schleife durchgeführt werden.