Liste in einer Liste

b0cc

Mitglied
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:

Java:
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()

Java:
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.

Java:
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
 
Zuletzt bearbeitet:
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]
 
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?
 
Danke, jetzt klappt das auch alles wie geplant 🙂

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.
 
Zuletzt bearbeitet:
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.
 
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
 
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?

Java:
if(Bauhaus.getFliesen())

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

Java:
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) ?
 
Zuletzt bearbeitet:
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
 
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 🙂
 
Habe jetzt ein anderes Problem mit den Listen in einer Liste.

Und zwar, wollte ich diese Liste sortieren.

Ich habe 2 ArrayList

Java:
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.
 
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>?
 
Wenn ich die Methode Collections.sort() versuche, gibt Eclipse mir folgenden Fehler raus

Java:
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 🙂
 
Zuletzt bearbeitet:
> eine Klasse Chromosom machen

war eine von zwei Varianten, die andere beginnt mit
> suche nach Comparator-Beispielen
 
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
 
Wenn ich die Methode Collections.sort() versuche, gibt Eclipse mir folgenden Fehler raus

Java:
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>>

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).
 

Neue Themen


Zurück
Oben