OOP Objekte erzeugen mit Hilfe einer for Schleife

bressanl

Mitglied
Hallo zusammen. Ich bin ein ziemlicher Anfänger und stecke bei einem (hoffentlich) realtiv simplen Problem fest.

In einem zweidimensionalen Array (type String) habe ich verschiedene Daten gespeichert. Immer die Daten in einer Zeile möchte ich nun einem Objekt übergeben. Dazu habe ich eine eigene Klasse erstellt sowie einen Konstruktor geschrieben. Nun würde ich gerne direkt mit einer for Schleife die Objekte erzeugen.

Java:
for (int j=0; j<length/7; j++){
			
			Auto auto = new Auto (a[j][0], a[j][1], a[j][2] , a[j][3] , a[j][4], a[j][5],  a[j][6]);
			
		}

[code=Java]

Dies funktioniert soweit, nur wird damit natürlich nur ein Objekt erzeugt welches immer überschrieben wird.  Ich möchte jedoch bei jedem Durchlauf ein neues erzeugen, welches am besten den Namen auto+j (oder etwas in der Art) trägt. Jedoch kommt dann entweder die Fehlermeldung "Type mismatch: cannot convert from Auto to int" oder "Duplicate local variable j". Mir ist klar warum das nicht funktioniert, weiss aber nicht, wie ich das Problem umgehen kann.

Wäre froh um einen guten Tipp :)
 
Mit 'nem Array, 'ner Liste oder 'ner Map...
Java:
Auto[] autos = new Auto[length/7];
for (int j=0; j<length/7; j++){

autos[j] = new Auto (a[j][0], a[j][1], a[j][2] , a[j][3] , a[j][4], a[j][5], a[j][6]);

}
 
Vielen Dank euch beiden für die tolle schnelle Hilfe. Das mit dem Array funktioniert bestens und die Erklärung zu den Varibalennamen hat mir auch weitergeholfen. Hab wohl die falschen Suchbegriffe eingegeben, dass ich das nicht selbst gefunden habe.

Noch einen schönen Tag wünsch ich euch !
 
Bin gleich noch auf ein kleines Problem gestossen. Ich würde nun die Objekte gerne nach eine der Eigenschaften sortieren. Ich bin da auf java.util.Arrays gestossen, werde aber nicht ganz schlau daraus. Ich habe mal sowas probiert:

Java:
for (int i=0; i<length/7; i++){

		Arrays.sort(autoliste[i].number);

		}

[code=Java] 

Dann bekomme ich diese Fehlermeldung "The method sort(int[]) in the type Arrays is not applicable for the arguments (String)". Nun ist es so, dass der Array zwar type String ist. Die Eigenschaft number ist jedoch immer ein Integer, welche ich gerne aufsteigend sortieren möchte. Ist dies mit Arrays.sort überhaupt möglich?
 
Das ist gleich mehrfach falsch. Ein Array in jedem Schleifendurchlauf zu sortieren ist quatsch. Wie wenn du zehnmal dasselbe Kartenspiel sortierst - nach dem ersten mal wird es irgendwie langweilig.

Dann kannst du nicht auf diese Weise angeben, nach welchem Kriterium sortiert werden soll, sondern entweder [c]Auto[/c] muss
Code:
Comparable<Auto>
implementieren (vor allem, wenn es nur eine "übliche" Sortierreihenfolge gibt, wie bei Zahlen oder Datumsen) oder einen
Code:
Comparator<Auto>
schreiben, der dann mit übergeben werden muss. Beides ist hier im Forum schon ausgiebig diskutiert worden. Siehe auch Java ist auch eine Insel – 11.9 Algorithmen in Collections

Übrigens musst du am Ende [/code] schreiben, damit das Syntax-Highlighting funktioniert.
 
Zuletzt bearbeitet:
Hab selbst gemerkt, dass das Quatsch ist, was ich probiert habe. Versuch mich gerade in das Comparable Interface einzulesen. Danke trotzdem.
 
Ich bin's nochmal. Ich hab das Internet etwas durchforstet und bin auf viele Beispiele gestossen. Eigentlich habe ich auch gemeint, dass das Prinzip verstanden zu haben habe, jedoch funktioniert das ganze noch nicht wie gewünscht. Zwar gibt mir Java selbst keine Fehlermeldung zurück, wenn ich das Programm jedoch durchlaufen lasse bekomme ich in der Konsole einfach nur [LAuto;@38c83cfd.

Hier ein Teil meines Codes aus der Klasse Auto

Java:
public int compareTo(Auto a) {

		if (a.number == null && this.number == null) {
			return 0;
		}

		if (this.number == null) {
			return 1;
		}
		if (a.number == null) {
			return -1;
		}
		return this.number.compareTo(a.number);

	}

Im Hauptprogramm habe ich dann einfach
Arrays.sort(objektautos);

Ich vermute das Problem könnte irgendwas mit den verschiedenen types zu tun haben. Bin aber ansonsten ziemlich ratlos. Mache ich einen grundlegenden Denkfehler oder liegt es an einem Detail?
 
Habe vergessen zu schreiben, dass ich im Hauptprogramm natürlich noch das aufrufe.

Java:
 System.out.println(objektbriefe);

Jedoch bin ich wegen dem Rest völlig verwirrt. Ich glaube ich habe da ein ziemliches Durcheinander in meinem Kopf.

Also im mittleren Teil vergleiche ich meine Objekte (besser gesagt eine Eigenschaft davon).Wenn das erste Element grösser ist geb ich -1 zurück, sind die beiden gleich 0 und ist das zweite grösser 1. Stimmt das so? Zuerst wollte ich die Werte mit Hilfe von < = > vergleichen, doch das funktioniert nicht, das mein Array type String ist. Nun muss meine Methode einen Integer zurückgeben. Doch ich verstehe nicht ganz was das sein soll. Ich meine ich will ja keine Zahl sondern einen sortierten Array..

Meine Idee war noch in einer for Schleife die Elemente zu vergleichen und mit einem switch zu vertauschen. Also falls das erste Element grösser ist wird es mit dem nächsten getauscht. Dafür müsste ich jedoch für jedes Element die ganze Schleife durchlaufen, richtig? Ist das nicht etwas zu aufwändig?

Sry für meinen chaotischen Post. Bin etwas überfordert und verdrehe die einfachsten Dinge 🙂 Hoffe du kannst mir helfen etwas Ordnung zu schaffen.
 
Überschreibe in deiner Auto-Klasse toString() und compareTo(). benutzt du eine ide? Füge die Annotaion @Override zu den beiden Methoden, um zu überprüfen ob du es richtig gemacht hast.
compare muss z.B. so aussehen
Code:
public int compareTo(Object o)
 
Moin,

Bin etwas überfordert und verdrehe die einfachsten Dinge 🙂 Hoffe du kannst mir helfen etwas Ordnung zu schaffen
wird schwierig .... 😀

Java:
 System.out.println(objektbriefe);
aha - und bitte was ist nun "objektbriefe" ???:L
Allerdings befürchte ich stark, dass es sich hier um ein eigenes Objekt handelt. Dessen Inhalt kannst Du nicht einfach so ausgeben! Du musst Stück für Stück die einzelnen Elemente (ich hoffe, es gibt auch solche) ausgeben.

Also im mittleren Teil vergleiche ich meine Objekte (besser gesagt eine Eigenschaft davon).Wenn das erste Element grösser ist geb ich -1 zurück, sind die beiden gleich 0 und ist das zweite grösser 1. Stimmt das so? Zuerst wollte ich die Werte mit Hilfe von < = > vergleichen, doch das funktioniert nicht, das mein Array type String ist. Nun muss meine Methode einen Integer zurückgeben. Doch ich verstehe nicht ganz was das sein soll. Ich meine ich will ja keine Zahl sondern einen sortierten Array..
Nun können wir wiederum nicht wissen, was "number" für einm Datentyp ist .... 😱

Nur mal grundlegend ein Vergleich auf null ist was anderes als auf '0' !!!
Zudem: falls es bspw. ein int ist, kann er nicht null sein, da elementarer Datentyp !

Gruß
Klaus
 
objektbriefe ist der Array in dem die Objekte enthalten sind (welche auch Elemente enthalten)

Aber es ist glaube ich besser, wenn ich noch mal von ganz vorne schildere was ich schon (verstanden) habe und wo mein Problem liegt. Ich habe in einem Array Objekte gespeichert. Jedes Objekt hat mehrere Eigenschaften alle type String. Nun möchte ich die Objekte nach einem der Eigenschaften sortieren.

Nun muss ich eine CompareTo Methode schreiben welche die bereits vorhandene überschreibt. In dieser kann ich bestimmen nach welcher Eigenschaft sortiert werden soll. In meinem Fall number. Die Elemente sind alles Integer die aufsteigend angeordnet werden sollen, haben jedoch den Typ String weil sie so eingelesen wurden.

Was ich nun nicht begreife ist wie ich diese CompareTo Methode aufbauen soll. Wenn ich vergleiche und je nach dem -1, 1 oder 0 zurückgebe, wird dann der Array automatisch sortiert? Würde es ausserdem Sinn machen, number in Integer umzuwandeln? Ich weiss es gibt unzählige Beispiele im Netz aber irgendwie habe ich nirgends das Grundkonzept gefunden (oder nicht begriffen 🙂)
 
Moin,

objektbriefe ist der Array in dem die Objekte enthalten sind (welche auch Elemente enthalten)

Aber es ist glaube ich besser, wenn ich noch mal von ganz vorne schildere was ich schon (verstanden) habe und wo mein Problem liegt. Ich habe in einem Array Objekte gespeichert. Jedes Objekt hat mehrere Eigenschaften alle type String. Nun möchte ich die Objekte nach einem der Eigenschaften sortieren.
eben - Du kannst nicht einfach das Array ausgeben, sondern jede Eigenschaft einzeln ...
Wie? Lies oben den Beitrag von Landei!

Was ich nun nicht begreife ist wie ich diese CompareTo Methode aufbauen soll. Wenn ich vergleiche und je nach dem -1, 1 oder 0 zurückgebe, wird dann der Array automatisch sortiert?
Durch den Vergleich? Nein - warum sollte es auch ...

Würde es ausserdem Sinn machen, number in Integer umzuwandeln?
Ich denke, number IST Integer (Du meinst übrigens hoffentlich "int", oder ? ... Integer ist nämliche eine Wrapperklasse) !

Gruß
Klaus
 
Mit Array und Arrays.sort bist Du bei der Sortierung auf die "natürliche" Reihenfolge (also die konkrete Implementierung der compareTo Methode) Deiner Objekt angewiesen. Wenn Du nach beliebigen Eigenschaften Deiner Objekte sortieren willst. Nimm List (z.B. ArrayList) anstelle von Array. Definiere für jede zu sortierende Eigenenschaft einen Comparator. Mittels Collection.sort(List, Comparator) kannst Du dann die List entsprechend er gewünschten Eigenschaft sortieren.
Einfach mal hier schauen: http://www.java-forum.org/allgemeines/39510-arrays-listen-sortieren.html
oder mittels der o.g. Schlagworte im Netz suchen.
 
Per Comparator kann man auch Arrays sortieren: Arrays (Java Platform SE 6)[],%20java.util.Comparator)

Zum Thema selber:
Rufst du
Code:
System.out.println(objektbriefe);
auf und objektbriefe ist kein primitiver Datentyp sondern ein Objekt, dann ruft Java auf diesem Objekt toString() auf und schreibt dir das Ergebnis auf den Ausgabestream.

Da du die Methode nicht überschreibst kriegst du die Default-Ausgabe, die hier definiert ist:
Object (Java Platform SE 6))

Zur compare-Methode:
Wenn number ein int oder double ist kannst du dir die null-Prüfungen sparen, da primitive default-Werte bekommen.
Die Compare-Methode würde sich dann auch auf ein
Code:
return Integer.valueOf(this.number).compareTo(a.number);
reduzieren.

Gruß
 
Danke euch beiden. Ich weiss selber nicht mehr wo mir der Kopf steht und stelle mich wahrscheinlich viel dümmer an als ich bin.
Zusammengefasst heisst das doch, dass ich einfach eine compareTo Funktion schreiben muss. Ich habe es mal so probiert. Doch das klappt nicht wirklich. Könnte mir mal jemand erklären, was genau meine Funktion können muss und was passiert wenn ich Arrays.sort anwende?


@Override
Java:
public int compareTo(Briefe argument) {
		
                if (Integer.parseInt(this.number) < Integer.parseInt(argument.number)){
                    return 1;}
                if (Integer.parseInt(this.number) > Integer.parseInt(argument.number)){
                    return -1;}
            return 0;
        }
 
Ist das Attribut
Code:
number
keine Zahl?

Was klappt nicht?
Implementiert Deine Klasse Briefe
Code:
Comparable<Briefe>
?

Die compareTo Methode muss einen int Wert zurückliefern 0 wenn beide Briefe "gleich" sind. Einen Wert kleiner 0 wenn der aktuelle Brief "kleiner" als der zu vergleichende Brief ist und einen Wert größer 0 wenn...

Wenn Briefe
Code:
Comparable<Briefe>
implementiert und die compareTo Methode wie folgt überschreibt:
Java:
public int compareTo(Briefe argument) {
     return Integer.parseInt(this.number)  - Integer.parseInt(argument.number);
}
Ist die natürliche Ordnung "Aufsteigend entsprechend dem Attribut number"
Eine Sortierung erreicht man mit:
Java:
Arrays.sort(briefeArray);
 
Es sind schon Zahlen aber type String. Das kommt daher, dass ich die Daten aus einem Textdokument eingelesen und danach in einem Array abgespeichert habe.

Meine Klasse Briefe implementiert Comparable<Briefe> dort kann das Problem nicht liegen.
Java zeigt beim Code auch keine bugs an. Lasse ich jedoch das Programm laufen kommen verschiedenste errors:

Exception in thread "main" java.lang.NumberFormatException: For input string: "3
"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
.....

Ich verstehe nur nicht wirklich was das bedeutet..

Das mit den Rückgabewerten 0, 1, -1 habe ich glaub kapiert. Ich versteh einfach den Zusammenhang zwischen CompareTo und dem Arrays.sort noch nicht ganz. Im CompareTo sage ich nach welcher Eigenschaft sortiert werden soll, richtig? Muss ich dann da noch eine Schleife einbauen damit alle Elemente verglichen werden? Und was meinst du mit: "Wenn Briefe Comparable<Briefe> implementiert und die compareTo Methode wie folgt überschreibt:"?

Vielen Dank für deine Geduld mit einem blutigen Anfänger 🙂
 
Falls die Sortierung der Objekte immer identisch ist einfach [JAPI]Comparable[/JAPI] in der Klasse implementieren (was man dabei machen muss steht im Interface), ruft man dann Arrays.sort oder Collections.sort auf wird die dortige compare-Methode verwendet.

Sollen mehrere Sortiermöglichkeiten möglich sein, dann kann man nicht mehrfach comparable implementieren, sondern muss für jede Möglichkeit einen [JAPI]Comparator[/JAPI] implementieren und diesen Verwenden.

Einfaches Beispiel:

Eine Person hat einen Namen und ein Alter, eine mögliche Ordnung wäre, die Personen nach dem Namen zu sortieren (indem man den Aufruf einfach an die Namen weiterleitet, String implementiert nämlich ebenfalls Comparable)
Java:
public class Person implements Comparable<Person>{

	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public int compareTo(Person o) {
		return getName().compareTo(o.getName());
	}
}

Sortieren würde dann so aussehen:
Java:
public static void main(String[] args) {
		Person[] persons = new Person[] { new Person("Peter", 42),
				new Person("Ralf", 12), new Person("Adam", 59),
				new Person("Quasimodo", 32) };

		for (int i = 0; i < persons.length; i++) {
			Person p = persons[i];
			System.out.println(p.getName() + " - " + p.getAge());
		}

		Arrays.sort(persons);
		System.out.println("----");
		for (int i = 0; i < persons.length; i++) {
			Person p = persons[i];
			System.out.println(p.getName() + " - " + p.getAge());
		}
		// Alternativ falls Person toString() implementieren würde
		// System.out.println(Arrays.toString(persons));
	}

Ausgabe:
Code:
Peter - 42
Ralf - 12
Adam - 59
Quasimodo - 32
----
Adam - 59
Peter - 42
Quasimodo - 32
Ralf - 12

Will man jetzt z.B. noch nach dem Alter und nach dem 2. Buchstaben sortieren können, müsste man auf seperate Comparator zurückgreifen:

Java:
public class PersonAgeComparator implements Comparator<Person>{

	@Override
	public int compare(Person p1, Person p2) {
		return Integer.valueOf(p1.getAge()).compareTo(Integer.valueOf(p2.getAge()));
	}

}

Java:
public class PersonNameSecondCharComparator implements Comparator<Person> {

	@Override
	public int compare(Person p1, Person p2) {
		if (p1.getName().length() > 1 && p2.getName().length() > 1) {
			return Character.valueOf(p1.getName().charAt(1)).compareTo(
					Character.valueOf(p2.getName().charAt(1)));
		}else{
			return 0;
		}
	}

}

Die Verwendung sieht dann so aus:

Java:
public static void main(String[] args) {
		Person[] persons = new Person[] { new Person("Peter", 42),
				new Person("Ralf", 12), new Person("Adam", 59),
				new Person("Quasimodo", 32) };

		for (int i = 0; i < persons.length; i++) {
			Person p = persons[i];
			System.out.println(p.getName() + " - " + p.getAge());
		}

		Arrays.sort(persons, new PersonAgeComparator());
		System.out.println("----");
		for (int i = 0; i < persons.length; i++) {
			Person p = persons[i];
			System.out.println(p.getName() + " - " + p.getAge());
		}
		Arrays.sort(persons, new PersonNameSecondCharComparator());
		System.out.println("----");
		for (int i = 0; i < persons.length; i++) {
			Person p = persons[i];
			System.out.println(p.getName() + " - " + p.getAge());
		}
	}

Ausgabe:
Code:
Peter - 42
Ralf - 12
Adam - 59
Quasimodo - 32
----
Ralf - 12
Quasimodo - 32
Peter - 42
Adam - 59
----
Ralf - 12
Adam - 59
Peter - 42
Quasimodo - 32

Code:
Integer.valueOf(int)
bzw
Code:
Character.valueOf(char)
habe ich verwendet damit ich auf die fertigen compare-Methoden dieser Klassen zurückgreifen kann, natürlich könnte man im jeweiligen Comparator auch die entsprechende Logik selber implementieren, aber wozu bestehende Lösungen neu implementieren?

Die Exception bekommst du übrigens vermutlich weil der String noch einen Zeilenumbruch enthält, meistens fliegt sie, wenn ein String keine gültige Zahl darstellt und man Integer.parseInt(String) verwendet.

Gruß
 
Vielen Dank für dieses Beispiel. Probier das bei mir noch etwas weiter umzusetzten. Noch zwei Fragen dazu.

Ist dieses get() set() immer nötig und was bewirkt es genau?
Kann ich meine Strings irgendwie in int umwandeln obwohl sie noch Zeilenumbrüche drin haben?
 
Wie ich festgestellt habe ist das Umwandeln in in gar nicht mehr nötig. Das Programm funktioniert auch so schon soweit.

Doch bei einer längeren Eingabe ist etwas komisches passiert. Das Programm hat alles schön sortiert bis auf die letzten zwei.

es sah dann vereinfacht so aus:

unsortiert:
Peter - 11
Anna -0
Kurt - 7
Kurt -2
Beat -1
Jakob -5
Evi -9

sortiert nach den Zahlen:

Anna - 0
Beat - 1
Kurt - 7
Evi - 9
Peter - 11
Kurt - 2
Jakob 5


Kann es daran liegen, dass zwei den gleichen Namen haben und der mit der grösseren Zahl zuerst kommt?

Vielen Dank auf jeden Fall für die Hilfe!
 
Du sortierst die Zahlen als String oder?

Falls ja hast du gerade den unterschied zwischen lexikographischer und numerischer Ordnung herausgefunden 😉

Java:
public static void main(String[] args) {
	
		int[] numbers = new int[] {11,0,7,2,1,5,9};
		String[] strings = new String[] {"11","0","7","2","1","5","9"};
		
		System.out.println(Arrays.toString(numbers));
		System.out.println(Arrays.toString(strings));
		Arrays.sort(numbers);
		Arrays.sort(strings);
		System.out.println(Arrays.toString(numbers));
		System.out.println(Arrays.toString(strings));
	}

Code:
[11, 0, 7, 2, 1, 5, 9]
[11, 0, 7, 2, 1, 5, 9]
[0, 1, 2, 5, 7, 9, 11]
[0, 1, 11, 2, 5, 7, 9]

Gruß
 
Ja, die Zahlen werden als String sortiert. Das heisst demnach, sie werden lexiographisch sortiert wie in einem Telefonbuch, richtig?

Ist es grundsätzlich möglich Strings numerisch zu sortieren? (was ja in meinem Fall logisch wäre, da die Strings nur Zahlen enthalten)
Ansonsten muss ich wohl die Strings in int umwandeln. Dann muss ich jedoch zuerst eine Möglichkeit finden die Zeilenumbrüche zu entfernen, da ich ansonsten nich Integer.parseInt() anwenden kann. Oder gibt es da auch noch andere Methoden?
 
Ist es grundsätzlich möglich Strings numerisch zu sortieren? (was ja in meinem Fall logisch wäre, da die Strings nur Zahlen enthalten)
Wenn String nur Zahlen enthalten (können) würde ich die Werte auch gleich als Zahl im Objekt halten.
Dann muss ich jedoch zuerst eine Möglichkeit finden die Zeilenumbrüche zu entfernen, da ich ansonsten nich Integer.parseInt() anwenden kann. Oder gibt es da auch noch andere Methoden?
Ich hab das nicht von Anfang an verfolgt, aber warum sind da überhaupt Zeilenumbrüche drin? Die sind ja selbst wenn die Variable als String deklariert ist falsch!
 
Moin,

Ja, die Zahlen werden als String sortiert. Das heisst demnach, sie werden lexiographisch sortiert wie in einem Telefonbuch, richtig?
Nun ja, mein Telefonbuch ist nach Namen sortiert 😀

Ist es grundsätzlich möglich Strings numerisch zu sortieren? (was ja in meinem Fall logisch wäre, da die Strings nur Zahlen enthalten)
Ansonsten muss ich wohl die Strings in int umwandeln. Dann muss ich jedoch zuerst eine Möglichkeit finden die Zeilenumbrüche zu entfernen, da ich ansonsten nich Integer.parseInt() anwenden kann. Oder gibt es da auch noch andere Methoden?
Wenn Du Deine Strings numerisch sortieren willst, dann musst sie auch in Nummern umwandeln.
Wie Du im Beitrag von FirePhoenix siehst, ist die lexikographische Ordnung anders als die Numerische !

Theoretisch kannst Du natürlich bei Deinen Strings auch Nullen voran stellen, dann geht es auch lexikographisch!
Java:
String[] strings = new String[] {"11","00","07","02","01","05","09"};
System.out.println(Arrays.toString(strings));

// ergibt:
[00, 01, 02, 05, 07, 09, 11]

Gruß
Klaus
 
Ich habe alle Daten aus einer Textdatei eingelesen:

Java:
In briefe = new In(args[0]);
		String briefe1 = briefe.readAll();
		String arraybriefe[] = briefe1.split("\n");

Das habe ich dann in einem Array gespeichert. Und aus diesem Array die Objekte erstellt. (Immer 7 nacheinanderfolgende Einträge gehören zu einem Objekt). Daher kommen die Zeilenumbrüche und der type String. Und ich weiss nicht wirklich wie ich das ändern kann.
 
Zuletzt bearbeitet:
Die Textdatei hab ich so gegeben. Vielen Dank für den Tipp mit dem \r\n. Hat super funktioniert. Ich konnte es in int umwandeln und CompareTo etwas abändern. Jetzt läuft alles bestens.
Nochmals Danke an alle für die tolle Hilfe. Komme evt. gerne nochmals darauf zurück 🙂
 

Zurück
Oben