Objekte Sortieren

bvdcomp

Aktives Mitglied
Hallo zusammen

Ich soll folgendes machen:

Objekte sortieren. Erstellen Sie dazu die Klasse Student, deren Objekte später nach unterschiedlichen Kriterien (z.B. Studentennummer, Alter, Notendurchschnitt) sortiert werden sollen

Ich habe nun dazu folgendes gemacht:

Java:
import java.util.ArrayList;

public class Student {
	private ArrayList<Student[]> studenten;
	private int[] sDaten;
	private String[] sDaten1;

	
	public Student()
	{
		studenten = new ArrayList<Student[]>();
	}
	public static void main(String[] args) {
		// Nach Note sortieren
		
		neuerStudent(int nr, String name, int alter, int note);
		System.out.println("nach Notendurchschnitt sortiert");
		Ausgeben();
		
	}
	
	public void neuerStudent(int nr, String name, int alter, int note)
	{
		sDaten[0] = nr;
		sDaten1[0] = name;
		sDaten[2] = alter;
		sDaten[3] = note;
		studenten.add(sDaten);
	}
	
	public String Ausgeben()
	{
		for(int i = 0; i <studenten.size(); i++){
			System.out.println("Student-Nr." + studenten.get[0] + "Name: " + studenten.get[1] + ", Alter: " + studenten.get[2] + ", Notenschnitt: " + studenten.get[3]);
		}			
	}
}

Dieser Code lässt sich nicht kompilieren, d.h. ich kann die AraayList Methoden
Java:
.add(), .get()
nicht verwenden.

Kann mir jemand da weiterhelfen??:bahnhof::bahnhof::bahnhof:
 
Zuletzt bearbeitet:
Student enthält ein ArrayList vom Array von Studenten? oO
Der Aufgabe kann so nicht stehen bleiben.
Benutze lieber für jeden Wert eine eigene Variable, dann ist der Code auch übersichtlicher.
.add und .get-Methoden kannst du nicht verwenden, da dein Studenten-Objekt eine ArrayList enthält, aber keine ArrayList ist.

Bring erstmal die Struktur in Ordnung (Student, der nur seine Daten hat), dann sehen wir weiter mit dem Sortieren.
 
Wenn nach unterschiedlichen Kriterien sortiert werden soll, bieten sich eher Comparators anstatt eine Comparable-Implementierung an. Ich würde das so machen:

Java:
public class Student {

  public final static NameComparator implements Comparator<Student>() {
      public int compareTo(Student s1, Student s2) {
         return s1.name.compareTo(s2.name);
      }
  } 

  public final static AgeComparator implements Comparator<Student>() {
      public int compareTo(Student s1, Student s2) {
         return s1.age - s2.age;
      }
  } 

  ...
}
 
Ich habe es nun soweit gebracht das ich nach Name sortieren kann. Nach Note geht jedoch nicht.

Ich erhalten folgenden Fehler:
Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The operator == is undefined for the argument type(s) double, null
	Cannot invoke compareTo(double) on the primitive type double

Ich glaube das Problem ist das ich folgende Methode nicht machen kann:
Java:
  public double getNote() {
    return this.note = note;

Wenn ich aber folgendes mache:
Java:
  public double getNote(double note) {
    return this.note = note;

Erhalte ich:
The method getNote(double) in the type Student is not applicable for the arguments ()

Wie kann ich nun folgende Methode so gestalten, das getNote() als String daherkommt?:
Java:
@Override
  public int compare(Student b1, Student b2) {
    if (b1.getNote()== null && b2.getNote() == null) {
      return 0;
Das geht nicht: b1.toString(getNote())

Kann mir jemand da weiterhelfen??🙁🙁

Danke
 
Primitive Datentypen (wie z.B. double) sind keine Objekte und besitzen somit keine Methoden, also auch keine Methode compareTo() ;-)
Aber man kann mit Ihnen rechnen: student1.getNote() - student2.getNote()
 
Ich kann doch primitive Datentypen in Objekte umwandeln mittels wrapper-klassen?
double in DOUBLE, das geht doch?

allerdings weiss ich nicht wie dies in meinem programm implementieren kann. :bahnhof::bahnhof:
 
Ist aber nicht notwendig.
Die compareTo() muss einfach nur einen int zurückliefern, der angibt ob das erste Objekt kleiner, größer oder gleich dem zweiten ist.
 
Was soll die getNote MEthode denn machen? Doch wohl eine Note zurückliefern?! Was soll also dieses return this.note=note?

Die Note wird ja ganz woanders gesetzt. Im übrigen kannst du entweder wie vorgeschlagen mit den double Werten rechnen oder du schreibst ne Methode die 2 Double Werte vergleicht und dann entweder -1, 0 oder 1 zurückliefert.
 
Was ich mach, ist folgendes:

Java:
...
  // Gib Note
  public double getNote() {
	  return note;
  }
 
  //Verändere Note
  public void setNote(double note) {
	  this.note = note;
  }
 
  public String toString() {
	  return "Student-Nr. " + this.stNr + ", " + this.name + ", " + this.alter + ", Notenschnitt: " + this.note;
  }
}
 
class NoteSortieren implements Comparator<Student> {
Kann ich folgendes ersetzten:
Java:
  public int compare(Student b1, Student b2) {
	  if (b1.getName()== null && b2.getName() == null) {
    	return 0;
	  }	
	  if (b1.getName() == null) {
    	return 1;
	  }
	  if (b2.getName() == null) {
    	return -1;
	  }
	  return b1.getName().compareTo(b2.getName());
  }
Mit:
Java:
@Override
  public int compare(Student b1, Student b2) {
	  if (b1.getNote()== null && b2.getNote() == null) {
    	     return b1.getNote()-b2getNote();
	  }
	  return b1.getNote().compareTo(b2.getNote());
  }
}

Oder sehe ich das falsch?
 
1. Primitive Datentypen können nicht null sein.
2. Was bringt bei dir der Vergleich mit Namen, wenn du nur auf null prüfst?
3. Wie schon oben erwähnt: primitive Datentypen haben keine Methoden, .compareTo gibt es also nicht.
4. Wenn beide Werte null sind, dann willst du die Differenz davon ausgeben?
5. Warum willst du vergleich nach Namen durch einen Vergleich nach Noten ersetzen? Das sind doch völlig verschiedene Sachen.
 
1. Primitive Datentypen können nicht null sein.
2. Was bringt bei dir der Vergleich mit Namen, wenn du nur auf null prüfst?
3. Wie schon oben erwähnt: primitive Datentypen haben keine Methoden, .compareTo gibt es also nicht.
4. Wenn beide Werte null sind, dann willst du die Differenz davon ausgeben?
5. Warum willst du vergleich nach Namen durch einen Vergleich nach Noten ersetzen? Das sind doch völlig verschiedene Sachen.


Oh, es sollten keinen Namen verglichen werden, die Noten sind es die zu vergleichen sind.
Die Note als Int oder double sollte doch in ein Objekt mittels wrapper-klassen geschenen, oder?
 
Ich glaub ich habs geschaft:
Java:
  public String getNote() {
	  String i = String.valueOf(note);
	  return i;

es sortiert nun. Aber aufsteigend! Eigentliche wollte ich es ab absteigend sortieren?!?!?
 
Läuft denn deine Klasse mitlerweile überhaupt? Wenn ja, dann zeig mal, was du daraus gemacht hast.
Ansonsten könnte der Vergleich von den Noten so aussehen:
Java:
public int compare(Student b1, Student b2) {
  return b1.getNote()-b2.getNote();
}
Wenn die Note von b1 größer ist, kommt eine positive Zahl raus, wenn kleiner - negative, wenn die gleich sind, dann ist das Ergebnis 0.
 
Warum die Umwandlung zum String? oO Genau so gut kannst du auch wegen Zahnschmerzen zum Proktologen gehen... Klappen tut es bestimmt, aber ob es Sinn macht...
Wenn du es absteigend sortiert haben willst, dann musst du das Ergebnis des Vergleiches umdrehen. (*-1 oder andersrum vergleichen)
 
Ich habe es nun soweit geschafft, das mein Programm das macht was es soll (fast):

Java:
public static void main(String[] args) {
        Comparator<Student> comp = new NoteSortieren();
        Student[] studis = {     
              new Student(4, "Archimedes Syrakus", 2296, 6.0),
              new Student(3, "Fritzli Schneider", 9, 5.9),
              new Student(1, "Walterli Tell junjun.", 12, 4.3),
              new Student(2, "Greengrey vonRotz", 20, 3.7),
              new Student(5, "Maria Stuart", 467, 2.9)
        };
        
        System.out.println("nach Notendurchschnitt sortiert:");
        System.out.println("-----------");
        for (Student alle : studis) {
              System.out.println(alle);
        }
        Arrays.sort(studis, comp);
        System.out.println("Sortiert:");
        System.out.println("-----------");
        for (Student alle : studis) {
              System.out.println(alle);
        }
        System.out.println("-----------");
        System.out.println("Process completed.");
 }

Es sortiert mach der Methode die Aufgerufen wird. -> hier NoteSortieren();

Ich möchte aber, das er nacheinander nach diesen Methoden soriert und dann diese Ausgibt:

Ich hab folgendes Probiert:
Java:
Comparator<Student> comp = new NummerSortieren();
Comparator<Student> comp1 = new NameSortieren();
Comparator<Student> comp2 = new AlterSortieren();
Comparator<Student> comp3 = new NoteSortieren();

Nun folge meint Problem: Wie bringe ich dies alles in einer For-Each-Schleife:

Java:
          for(Student alles: comp????){
          System.out.println("nach Notendurchschnitt sortiert:");
	  System.out.println("-----------");
	  for (Student alle : studis) {
		  System.out.println(alle);
	  }          
	  Arrays.sort(studis, comp);
	  Arrays.sort(studis, comp1);
	  Arrays.sort(studis, comp2);
	  Arrays.sort(studis, comp3);
	  System.out.println("Sortiert:");
	  System.out.println("-----------");
	  for (Student alle : studis) {
		  System.out.println(alle);
	  }
	  System.out.println("-----------");
	  System.out.println("Process completed.");
}

Ich komme nun nicht merh weiter:rtfm::rtfm::rtfm:
 
Um mit einer Schleife darüber zu laufen, musst du es schon in irgendwas speichern, was es möglich macht, sowas wie:
Java:
List<Comparator> comp = new ArrayList<Comparator>();
comp.add(new NoteSortieren());
....
for (Comparator curComp:comp) {
....
}
 
Wenn ich dies Umsetzte, erhalte ich folgenden Fehler:
Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The type List is not generic; it cannot be parameterized with arguments <Comparator>

	at Student.main(Student.java:19)

Typ List ist nicht generisch, keine parametrisierung möglich, heist es.:bahnhof:
 
Wenn ich dies Umsetzte, erhalte ich folgenden Fehler:
Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The type List is not generic; it cannot be parameterized with arguments <Comparator>

	at Student.main(Student.java:19)

Typ List ist nicht generisch, keine parametrisierung möglich, heist es.:bahnhof:

Ich habe noch import java.util.List; importiert:

Wieder Fehler:
Java:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The method sort(T[], Comparator<? super T>) in the type Arrays is not applicable for the arguments (Student[], List<Comparator>)

	at Student.main(Student.java:40)

Warum die Methode sort. hier nicht geht, weis ich allerdings nicht. Eclipse sagt noch folgendes:

Java:
Comparator is a raw type. References to generic type Comparator<T> should be parameterized
 
Zuletzt bearbeitet:
Und kannst du mir sagen wie ich das am besten machen kann??

Ich danke dir für deine Hilfe. Du warst mir bislang wirklich eine grosse Hilfe.

Kannst du mir sagen was hier falsch ist?

Java:
public static void main(String[] args) {
	  List<Comparator> comp = new ArrayList<Comparator>();
	  
	  comp.add(new NummerSortieren());
	  comp.add(new NameSortieren());
	  comp.add(new AlterSortieren());
	  comp.add(new NoteSortieren());
	  
	  Student[] studis = {     
			  new Student(4, "Archimedes Syrakus", 2296, 6.0),
              new Student(3, "Fritzli Schneider", 9, 5.9),
              new Student(1, "Walterli Tell junjun.", 12, 4.3),
              new Student(6, "Greengrey vonRotz", 20, 3.7),
              new Student(5, "Maria Stuart", 467, 2.9)
	  };
	  
	  for (Comparator curComp: comp) {
		  System.out.println("nach Notendurchschnitt sortiert:");
		  System.out.println("-----------");
		  for (Student alle : studis) {
			  System.out.println(alle);
		  }
		  Arrays.sort(studis, comp);
		  System.out.println("Sortiert:");
		  System.out.println("-----------");
		  for (Student alle : studis) {
			  System.out.println(alle);
		  }
	  }
	  System.out.println("-----------");
	  System.out.println("Process completed.");
  }
 
comp ist deine Liste, curComp ist innerhalb der Schleife jeweils ein Comperator...
:toll::applaus:

Cool, jetzt hab ich es:
Java:
Arrays.sort(studis, curComp);

Es funktioniert. Besten Dank.

Eine letzte Frage habe ich noch:

Wenn ich vor jedem Sortieren noch den Titel angeben will, nach was es sortiert wird:
Wie kann ich einen System.out.println in einem return einpacken?

Ich habe an sowas gedacht:
Java:
return b2.getNote().compareTo(b1.getNote()) ?? System.out.println("Nach Note sortieren: ");

Geht das überhaupt? - Habe festgestellt das es nicht geht.

Habe folgendes probiert:

Java:
	  String[] titel = {     
			  new String("Nach Nummer sortieren: "),
			  new String("Nach Namen sortieren: "),
			  new String("Nach Alter sortieren: "),
			  new String("Nach Durchschnittsnote sortieren: ")
	  };
	  for (Comparator curComp: comp) {
		  System.out.println(titel);

Ich erhalte aber die Speicheradresse [Ljava.lang.String;@64c3c749

Nun stocke ich :rtfm::rtfm::rtfm:
 
Zuletzt bearbeitet:
Du kannst die toString()-Methode von deinen Comperator-Klassen überschreiben und da den Namen zurückgeben. Dann rufst du inder Schleife
Code:
System.out.println(curComp)
auf
 
Dann muss ich das ja für alle vier Comparatoren; NummerSortieren(), NameSortieren(), AlterSortieren(), NoteSortieren() machen oder?

Und die toString()-methode benutzer ich ja schon:
Java:
public String toString() {
	 return  "Student-Nr. " + this.stNr + ", " + this.name + ", " + this.alter + ", Notenschnitt: " + this.note;
  }
 
Ja, das musst du wohl.
Sieht verdächtig nach der toString methode der Student-Klasse. Ich rede von den Comparator-Klasse, die bei die scheinbar einzeln existieren.
 
Ja, das musst du wohl.
Sieht verdächtig nach der toString methode der Student-Klasse. Ich rede von den Comparator-Klasse, die bei die scheinbar einzeln existieren.

Ich habs nun anders gelöst:

Java:
String[] titel = new String[4];
	titel[0] = "Nach Nummer sortieren: ";
	titel[1] = "Nach Namen sortieren: ";
	titel[2] = "Nach Alter sortieren: ";
	titel[3] = "Nach Durchschnittsnote sortieren: ";
	
	int i = 0;
	for (Comparator curComp: comp) {
		System.out.println(titel[i]);

Es funktioniert.:applaus::applaus::applaus:

XHelp ich danke dir viel viel viel mal, du hast mir sehr viel geholfen.:toll::toll::toll::applaus::applaus:
 
Zuletzt bearbeitet:
Ich habs nun anders gelöst:

Java:
String[] titel = new String[4];
	titel[0] = "Nach Nummer sortieren: ";
	titel[1] = "Nach Namen sortieren: ";
	titel[2] = "Nach Alter sortieren: ";
	titel[3] = "Nach Durchschnittsnote sortieren: ";
	
	int i = 0;
	for (Comparator curComp: comp) {
		System.out.println(titel[i]);

Es funktioniert.:applaus::applaus::applaus:

XHelp ich danke dir viel viel viel mal, du hast mir sehr viel geholfen.:toll::toll::toll::applaus::applaus:

Oh man😳

Es funktioniert eigentlich alles so wie es sollte, ausser:

Nach Alter aufsteigend sortieren:
unsortiert:
-----------
Student-Nr. 4, Archimedes Syrakus, 99, Notenschnitt: 6.0
Student-Nr. 3, Fritzli Schneider, 9, Notenschnitt: 5.9
Student-Nr. 2, Greengrey vonRotz, 20, Notenschnitt: 3.7
Student-Nr. 5, Maria Stuart, 85, Notenschnitt: 2.9
Student-Nr. 1, Walterli Tell junjun., 12, Notenschnitt: 4.3

Sortiert:
-----------
Student-Nr. 1, Walterli Tell junjun., 12, Notenschnitt: 4.3
Student-Nr. 2, Greengrey vonRotz, 20, Notenschnitt: 3.7
Student-Nr. 4, Archimedes Syrakus, 2296, Notenschnitt: 6.0
Student-Nr. 5, Maria Stuart, 467, Notenschnitt: 2.9
Student-Nr. 3, Fritzli Schneider, 9, Notenschnitt: 5.9
<-- Diese beiden werden nicht sortiert!!

Die Implementierung ist doch gleich:
Java:
class AlterSortieren implements Comparator<Student> {
	@Override
	public int compare(Student b1, Student b2) {
		if (b1.getAlter()== null && b2.getAlter() == null) {
			return 0;
		}
		if (b1.getAlter() == null) {
			return 1;
		}
		if (b2.getAlter() == null) {
			return -1;
			}
		return b1.getAlter().compareTo(b2.getAlter());
		}
}
 
Ist schon alles richtig. Die werden wie Strings sortier... ich entsinne mich weiter oben geschrieben zu haben, dass du mit Zahlen arbeiten solltest....
 

Zurück
Oben