problem mit sortierung interface comperator

sh33p

Bekanntes Mitglied
Java:
public class Student {
private int matrikelnummer;
private String nachname;
private String vorname;
public Student (String n, String v, int mnr) {
nachname = n;
vorname = v;

matrikelnummer = mnr;
}
public int getMatrikelNr() {
return matrikelnummer;
}
public String getNachname() {
return nachname;
}
public String getVorname() {
return vorname;
}
public void print() {
System.out.println ("Nachname: " + nachname);
System.out.println ("Vorname: " + vorname);
System.out.println ("Matrikelnummer: " + matrikelnummer);
}
}
// Klasse Nachnamevergleicher

import java.util.*;
public class NachnameVergleicher implements Comparator<Student> {

public int compare(Student s1, Student s2){

if( s1.getNachname() == null && s2.getNachname() == null) {
  return 0;
}
if( s1.getNachname() == null){
  return 1;
}
if (s2.getNachname() == null){
  return -1;
}


 return s1.getNachname().compareTo(s2.getNachname());

}
}
// Klasse Studentensortierer

import java.util.*;
public class StudentenSortierer {
public static void main (String[] args) {
ArrayList <Student >liste = new ArrayList<Student>();
liste.add (new Student ("Mayer", "Martin", 123478));
liste.add (new Student ("Hauser", "Ingo", 12346));
liste.add (new Student ("Munk", "Tilo", 123477));
liste.add (new Student ("Meier", "Frank", 123456));
print ("Liste unsortiert:\n", liste);

Collections.sort (liste);
print ("Liste sortiert nach Nachnamen:\n", liste);
}
public static void print (String titel, List<Student> studenten) {
System.out.println ("-------------------------------");
System.out.println (titel);
for (Student studi : studenten) {
System.out.println (studi.getMatrikelNr() + "\t" +
studi.getNachname() + "\t" +
studi.getVorname());
}
}
}

bin gerade dabei sortierungen von collections zu erlernen´.aber ich blick noch nicht ganz durch.
Man kann das Interface Comperator verwende,was von den ListKlassen impelementiert wird?!

die schwierigkeit besteht ja darin, die methode zu schreiben,welche nach bestimmten kriterien sortiert.hier möchte ich nach dem nachnamen des studenten sortieren.nur das klappt offensichtlich nicht ^^. könnt ihr mir mal anhand dieses beispiels erklären, was das comperator interface genau macht und wie man diese "vergleichsmethoden" schreibt?
vielen dank
 
Java:
Collections.sort (liste,NachnameVergleicher);

oder wie meinste?

Collextions.sort erwartet ja die liste und comperator objekt
 
Hi,
da du hier ja quasi Strings vergleichen möchtest, diese selbst eine natürliche Ordnung haben, dadurch dass sie das Comparable-Interface implementieren, kannst du der String Klasse das Sortieren überlassen wie du ja schon richtig in Zeile 45 getan hast! Deine vorherigen if-Abfragen sind daher garnicht notwendig!

Java:
public class NachnameVergleicher implements Comparator<Student> {
 
public int compare(Student s1, Student s2){
 return s1.getNachname().compareTo(s2.getNachname());
}
}

Collections.sort (liste,NachnameVergleicher);

nee du musst ein Objekt erstellen
Code:
Collections.sort (liste,new NachnameVergleicher());
 
Ja, aber da bietet es sich eig. eher nicht an, weil du dann erstmal zwei Integer Objekte erstellen müsstest.

Java:
return s1.getMatrikelNr() - s2.getMatrikelNr();

reicht da in den meisten Fällen aus denk ich.
 
http://openbook.galileodesign.de/javainsel8/javainsel_12_004.htm#mj02f08ed5d8822fef2383619f653b0ce6 hat gesagt.:
Der Rückgabewert von compare() beim Comparator beziehungsweise compareTo() bei Comparable ist <0, =0 oder >0 und bestimmt so die Ordnung der Objekte

Beispiel:

d.h. es reicht einfach die zweite Zahl von der Ersten zu subtrahieren, denn wenn beide gleich sind, gibst du ja 0 zurück, ist die ene größer, gibst du halt größer 0 zurück, same bei kleiner!
 
d.h ich hätte es auch so schreiben können?!

Java:
public int compare(Student s1,Student s2){

if(s1.getMatrikelNr() == s2.getMatrikelNr()){
  return 0;
}

if( s1.getMatrikelNr() > s2.getMatrikelNr()){
  return 1;
}
if(s2.getMatrikelNr() < s1.getMatrikelNr()){
  return -1;
}


}
}
 
fast 😀
Wieso hast du s1 und s2 getauscht in der letzten Bedingung? Dadurch lautet sie ja genau wie die darüber Liegende 😀
Ansonsten würde es so gehen ja. Aber wieso kompliziert machen, wenn es einfach geht. An deinem Beispiel sieht man ja sehr gut, dass sich so schneller Fehler einbauen lassen als durch eine einzige simple Zeile!
 
ja 😀.
aber der compiler sagt mir noch: missing return statement
was muss ich noch zurück geben?

/edit: habs schon´😀
 
Zuletzt bearbeitet:
Mach ein if - if - else ..
Also ersetz das letzte if durch ein else (Bedingung rauslöschen)...wenn die Nr. weder gleich, noch größer ist, kann sie ja nur kleiner sein und der Compiler meckert auch nicht.Oder du benutzt den ternären Operator 😀

Java:
return s1.getMatrikelNr() == s2.getMatrikelNr() ? 0 : (s1.getMatrikelNr() > s2.getMatrikelNr() ? 1 : -1);

😀
 

Neue Themen


Zurück
Oben