4 Stimmen

Eine ArrayList von ArrayList<Integer> erstellen

Ich versuche, den folgenden Code zu verwenden, um eine mehrdimensionale ArrayList zu erstellen. Mein Code füllt die innere ArrayList (localSolutions) ganz gut, aber wenn ich versuche, ein hinzufügen, dass ArrayList auf die äußere ArrayList (Lösungen), etwas geht schief, und es fügt leere ArrayLists statt.

public class MathCapstone {

public static void main(String[] args) {
    ArrayList<ArrayList<Integer>> list = entireList(10);

    for(int q = 0;q<list.size();q++) {
        System.out.println(list.get(q));
    }

public static ArrayList<ArrayList<Integer>> entireList(int max) {
    ArrayList<ArrayList<Integer>> solutions = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> localSolutions = new ArrayList<Integer>();

    for(int i = 1; i <= max; i++) {
        for(int j = 1; j < i; j++) {
           //System.out.println(j + "mod" + i + "=" + (j*j)%i);
            if ((j*j)%i == 1) {
                localSolutions.add(j);
            }
        }
        //System.out.println(localSolutions.toString());
        solutions.add(localSolutions);
        localSolutions.clear();
    }
    return solutions;
}

Auf eine letzte Anmerkung: wäre es besser, eine HashMap von ArrayLists (schließlich werde ich CDFs für maximale Werte bis zu etwa 10k erstellen) zu verwenden?

3voto

Savvas Dalkitsis Punkte 11241

Sie löschen die localSolutions Liste.

In Java kopiert man nur den Verweis auf ein Objekt, nicht das eigentliche Objekt selbst. Wenn Sie also die localSolutions Liste in Ihrem Lösungen Liste, sowohl die localSolutions Referenz und dem ersten Eintrag der Lösungen Liste auf dasselbe Objekt verweisen.

Wenn Sie also die localSolutions Liste, löschen Sie den ersten Eintrag in Ihrer Lösungen Liste.

3voto

millimoose Punkte 37843

Sie tun es:

localSolutions.clear();

Das Hinzufügen einer Liste zu einer anderen Liste fügt nicht eine Kopie der Liste hinzu, sondern dasselbe Listenobjekt. Was Ihr Code in der äußeren Schleife tut, ist, dieselbe Liste mit Elementen zu füllen, sie zu leeren und sie zu solutions . solutions enthält max Verweise auf die gleiche, leere Liste.

Was Sie tun wollen, ist:

ArrayList<ArrayList<Integer>> solutions = new ArrayList<ArrayList<Integer>>();
for(int i = 1; i <= max; i++) {
    ArrayList<Integer> localSolutions = new ArrayList<Integer>();
    for(int j = 1; j < i; j++) {
       //System.out.println(j + "mod" + i + "=" + (j*j)%i);
        if ((j*j)%i == 1) {
            localSolutions.add(j);
        }
    }
    //System.out.println(localSolutions.toString());
    solutions.add(localSolutions);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X