# Liste in einer Liste



## b0cc (27. Aug 2012)

Hey,

es geht um ein Anfang einer Java-Anwendung und zwar, habe ich 2 Klassen.

1.Klasse enthält die GUI (die mit Hilfe von Windowbuilder erstellt wurde)
2.Klasse sollte die Berechnung durchführen

Also es gibt bis jetzt nur CheckBox(13 Stück) und ein Button. Man wählt also verschiedene CheckBox's und drückt auf den Button:


```
btnWegBerechnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//Berechnung ist die 2.Klasse
				Berechnung.abteilungen(); 
				Berechnung.anzAbteilungen = 0;
				Berechnung.chromosom.clear();
				Berechnung.population.clear();
			}
		});
```


Hier wird abgefragt welche und wie viele CheckBox ausgewählt wurden,
Bauhaus.getBauelemente() und andere if's benutzen die Methode isSelected()


```
public class Berechnung {
	static int anzAbteilungen = 0;
        static ArrayList<String> chromosom = new ArrayList<String>(); 
	static ArrayList<Object> population = new ArrayList<Object>();
	
	public static void abteilungen(){
		
		if(Bauhaus.getBauelemente()){
			chromosom.add(Bauhaus.bauelemente.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getBaustoffe()){
			chromosom.add(Bauhaus.baustoffe.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getEisenwaren()){
			chromosom.add(Bauhaus.eisenwaren.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getElektroinstallation()){
			chromosom.add(Bauhaus.elektroinstallation.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getElektroLeuchten()){
			chromosom.add(Bauhaus.elektroLeuchten.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getFarbenTapetenGalerie()){
			chromosom.add(Bauhaus.farbenTapetenGalerie.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getFliesen()){
			chromosom.add(Bauhaus.fliesen.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getParkettLaminatPaneele()){
			chromosom.add(Bauhaus.parkettLaminatPaneele.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getSanitaerSanitaerinstallation()){
			chromosom.add(Bauhaus.sanitaerSanitaerinstallation.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getSchreinerei()){
			chromosom.add(Bauhaus.schreinerei.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getStadtgarten()){
			chromosom.add(Bauhaus.stadtgarten.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getTeppicheInnendeko()){
			chromosom.add(Bauhaus.teppicheInnendeko.getText());
			anzAbteilungen++;
		};
		if(Bauhaus.getWerkzeugeMaschinen()){
			chromosom.add(Bauhaus.werkzeugeMaschinen.getText());
			anzAbteilungen++;
		};
```

Nun sollte eine ArrayList(chromosom) die ausgewählten CheckBox's mit ihren Namen(String) speichern. 
Diese ArrayList sollte vermischt werden(mit Collections.shuffle(list)).
Nach dem mischen kommen noch 2 Strings am Anfang und am Ende der ArrayList. 
Dann soll diese vermischte ArrayList in eine andere ArrayList gespeichert werden, die am Anfang/Ende eingefügten Strings wieder gelöscht werden und wieder gemischt usw. 100 mal.


```
ArrayList<String> chrom = new ArrayList<String>();
		
		for(int j=0; j<100; j++){	
		Collections.shuffle(chromosom);	
		chromosom.add(0, "Eingang");
		chromosom.add(chromosom.size(),"Ausgang");
		
		chrom = chromosom;
		population.add(chrom);
		chromosom.remove(0);
		chromosom.remove("Ausgang");
		
		}
```

So sollte am ende eine ArrayList mit 100 ArrayListen erstellt werden. 
Doch beim Testen und Ausgeben wird eine ArrayList mit 100 ArrayListen erstellt, in den immer die 100 selben(selbe Reihenfolge) Strings vorhanden sind.

Das Problem liegt wahrscheinlich irgendwo in den globalen Variablen oder an static, aber er will ohne static die zwei Klassen nicht verwalten, gibt immer Fehler an.

p.s. Ich arbeite mit Eclipse


----------



## Landei (27. Aug 2012)

Wenn du etwas wie [c]chrom = chromosom;[/c] machst, verweisen beide Variablen auf *dieselbe Liste*, alles was du mit chrom anstellst, ist auch in chromosom sichtbar und umgekehrt. Wenn du eine Kopie erstellen willst, geht das so: [c]chrom = new ArrayList<String>(chromosom);[/c]


----------



## tribalup (27. Aug 2012)

b0cc hat gesagt.:


> Nach dem mischen kommen noch 2 Strings am Anfang und am Ende der ArrayList.
> Dann soll diese vermischte ArrayList in eine andere ArrayList gespeichert werden, die am Anfang/Ende eingefügten Strings wieder gelöscht werden und wieder gemischt usw. 100 mal.



Wozu kommen noch diese beiden Strings an den Anfang und an das Ende?


----------



## b0cc (27. Aug 2012)

Danke, jetzt klappt das auch alles wie geplant 



tribalup hat gesagt.:


> Wozu kommen noch diese beiden Strings an den Anfang und an das Ende?



Die gehören in diese String-Folge rein, aber die müssen immer am Anfang und am Ende stehen, die anderen Strings möchte ich immer wieder vermischen, diese beiden String aber nicht, so füge/lösche ich diese extra.


----------



## Crian (28. Aug 2012)

Reicht es dann nicht, sie einmal am Ende einzufügen?


----------



## b0cc (28. Aug 2012)

Crian hat gesagt.:


> Reicht es dann nicht, sie einmal am Ende einzufügen?



Meinst du wenn die ArrayList fertig ist, mit einer for-Schleife die Strings am Anfang/Ende einfügen?

Ja klar, so könnte man es auch machen 

Habe da noch eine Frage, die ganzen if's (13 Stück hintereinander), das sieht doch nicht gut aus, aber ich weiss nicht wie man das anders umschreiben könnte.


----------



## SlaterB (28. Aug 2012)

was die get-Methoden machen und was die direkt angesprochenden Variablen für Objekte enthalten verrätst du nicht (edit: ok, CheckBox),
anscheinend sind aber alle gleichartig, könnten in eine Liste, entweder hier mit 13 Zeilen, oder generell schon so eingebaut,

mit einer Liste ginge jedenfalls Schleifenverarbeitung, dann wäre der Rest noch 4 Zeilen,
die get-Methoden würden hier nicht mehr benötigt, fielen evtl. auch ganz weg, spart noch mehr


----------



## b0cc (28. Aug 2012)

SlaterB hat gesagt.:


> was die get-Methoden machen und was die direkt angesprochenden Variablen für Objekte enthalten verrätst du nicht (edit: ok, CheckBox),
> anscheinend sind aber alle gleichartig, könnten in eine Liste, entweder hier mit 13 Zeilen, oder generell schon so eingebaut,
> 
> mit einer Liste ginge jedenfalls Schleifenverarbeitung, dann wäre der Rest noch 4 Zeilen,
> die get-Methoden würden hier nicht mehr benötigt, fielen evtl. auch ganz weg, spart noch mehr



meinst du die get-Methoden? 


```
if(Bauhaus.getFliesen())
```

Wenn ja, dann habe ich oben geschrieben, dass diese nur prüfen ob die CheckBox ausgewählt wurde


```
public static boolean getFliesen() {
		return fliesen.isSelected();
	}
```

Wie meinst du das mit einer Liste?

Die get-Methoden könnte man auch weglassen und dierekt die CheckBox mit isSelected() abfragen, meinst du das so mit "get-Methoden würden hier nicht mehr benötigt"(c) ?


----------



## SlaterB (28. Aug 2012)

jaja, die Zeile zum get überlesen,

alle CheckBox-Objekte könnten in eine Liste eingefügt werden, dann kann man darüber iterieren, getSelected() und getText() aufrufen,
nicht naheliegend?


> Die get-Methoden könnte man auch weglassen und dierekt die CheckBox mit isSelected() abfragen

das kommt nebenbei heraus, ja


----------



## b0cc (28. Aug 2012)

> alle CheckBox-Objekte könnten in eine Liste eingefügt werden, dann kann man darüber iterieren, getSelected() und getText() aufrufen,
> nicht naheliegend?



Danke, hat alles geklappt und mir die ganzen if's und get-Methoden(die auch so überflüssig waren) erspart


----------



## b0cc (30. Aug 2012)

Habe jetzt ein anderes Problem mit den Listen in einer Liste.

Und zwar, wollte ich diese Liste sortieren.

Ich habe 2 ArrayList


```
ArrayList<String> chromosom = new ArrayList<String>(); 
	List<ArrayList<String>> population = new ArrayList<ArrayList<String>>();
```

Also in der ersten Liste(chromosom) stehen Strings, "Flisen", "Bauelemente" usw. und am Ende dieser Liste steht ein String  z.B. "12.7", das ich später als double-Wert verwende. 
Die zweite Liste(population) enthält die chromosom-Listen.
Nun wollte ich diese Liste(population) sortieren, also nach den double-Werten der chromosom-Liste.

Aber anscheinend klappt es nicht so einfach mit Collection.sort(). Den er kann keine Listen sortieren und die compareTo-Methode ist auch noch ein Rätsel für mich, also wie ich die Listen richtig vergleichen soll.

Wahrscheinlich muss ich es manuell machen, listen durchgehen und in eine andere sortiert ablegen.

Wäre für jede Hilfe dankbar.


----------



## SlaterB (30. Aug 2012)

suche nach Comparator-Beispielen, der gibt für Collections.sort() an wie zwei Elemente zu sortieren sind,
die Elemente sind chromosom-Listen, von denen das letzte Element vergleichen

oder geht eine Chromoson-Klasse statt List<String>?


----------



## b0cc (30. Aug 2012)

Wenn ich die Methode Collections.sort() versuche, gibt Eclipse mir folgenden Fehler raus


```
Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<ArrayList<String>>). The inferred type ArrayList<String> is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>
```

Eine Chromosom-Klasse hab ich nicht. Ist nur eine String-List.

Oder meintest du ich sollte besser eine Klasse Chromosom machen und mit der arbeiten?
Habe die Frage leider nicht ganz verstanden


----------



## SlaterB (30. Aug 2012)

>  eine Klasse Chromosom machen

war eine von zwei Varianten, die andere beginnt mit 
> suche nach Comparator-Beispielen


----------



## b0cc (30. Aug 2012)

SlaterB hat gesagt.:


> war eine von zwei Varianten, die andere beginnt mit
> > suche nach Comparator-Beispielen



Mich hat jetzt nur die Fehlermeldung irritiert, dass Collections.sort() nicht dafür geeignet ist, Listen in einer Liste zu sortieren. Auch wenn ich compareTo()-Methode definiere.


Mit einer Chromosom-Klasse könnte das theoretisch erstmal gehen. 
Weiss jetzt erstmal nicht wie sich das aber auf Collections.shuffle(chromosome) auswirkt, die ich auch noch nutze. Jetzt mischt er ja die ArrayList, ob es auch gut geht wenn es eine Klasse ist. Muss ich aber gucken


----------



## Landei (31. Aug 2012)

b0cc hat gesagt.:


> Wenn ich die Methode Collections.sort() versuche, gibt Eclipse mir folgenden Fehler raus
> 
> 
> ```
> ...



Die Fehlermeldung sagt doch ganz genau, was falsch ist: [c]ArrayList<String>[/c] implementiert nicht [c]Comparable<...>[/c]. Du muss die andere Variante von sort verwenden, die noch einen Comparator annimmt, in deinem Fall einen [c]Comparator<ArrayList<String>>[/c]. Das ist nicht schwer, du musst dir halt nur überlegen, wie du vergleichen willst (was z.B. passieren soll, wenn die Listen nicht gleichlang sind).


----------



## b0cc (31. Aug 2012)

Danke! Habe die Liste mit dem Comparator und dem sort(List<T> list, Comparator<? super T> c) sortiert


----------

