Array mit Objekten sortieren

Partytiger

Grünschnabel
Hi Leute!

Folgendes Problem: Ich habe ein Programm, 2 Klassen, es wird ein Array mit versschiedenen Objekten verschiedenen Typs befüllt. Matrikelnummer, Name, Alter.

Nun möchte ich die Ausgabe mit comparable gerne nach Matrikelnummer sortiert haben...

Code:
package vierteaufbgabe;

import java.util.Arrays;
import java.lang.Comparable;

//class wird erstellt
public class Studenten_Verwaltung{

  //array und Variable deklarieren  
  static Student[] studenten;
  static int s;

  public static void main(String[] arguments){
      
    //array und Variable initialisieren
    studenten = new Student[10];
    s = 0;
    
    //Daten die das Programm aufnehmen soll.
    Student student_1=new Student("0243242","Peter Haunschmied",22);
    add(student_1);
    Student student_2=new Student("0324822","Luther Lechs",21);
    add(student_2);
    Student student_3=new Student("0235334","Thomas Bernhard",22);
    add(student_3);
    Student student_4=new Student("0645545","Barack Obama",26);
    add(student_4);
    Student student_5=new Student("0224353","Vladimir Putin",23);
    add(student_5);
    Student student_6=new Student("0143344","Michael Durovic",25);
    add(student_6);
    
    Arrays.sort(studenten);
         
    
    //for-Schleife um die Daten der Klasse wiederzugeben
    for(int i=0;i<studenten.length;i++){

      if(studenten[i]!=null){ //wenn keine weitere Spalte im Array mit Daten befüllt ist wird die Schleife beendet.
      System.out.println(studenten[i].toString());
      }

    }
  }


// add Methode um eine neue Array-Spalte zu erstellen und die Daten der Klasse zuzuweisen.
  static void add(Student neu) {
    if (s <= studenten.length) { //Kontrolle ob noch ein freier Platz im Array ist.
      studenten[s] = new Student(neu); //ansprechen einer leeren Arrayspalte
      s++;
    }else{
      System.out.println("Keine freien Speicherplätze vorhanden");
    }
  }
  
}


package vierteaufbgabe;

import java.util.Arrays;
import java.lang.Comparable;

//erstellen der Klasse Studenten
class Student {

  //Variablen deklarieren
  private String matrikelnr; 
  private String name; 
  private int alter;


  //Methode zur Verarbeitung der Eingabe
  Student(String matrikelnr, String name, int alter){
    this.matrikelnr = matrikelnr;
    this.name = name;
    this.alter = alter;
    
   
  }

  //Methode zur Zuweisung der Eingaben in eine neue Array-Spalte
  Student (Student neu){
    this.matrikelnr=neu.matrikelnr;
    this.name=neu.name;
    this.alter=neu.alter;
  }
   

  //Methoden um die Klasseninhalte wiederzugeben
  @Override
  public String toString(){
    return (matrikelnr+" "+name+" "+alter);
  }

}
 
Zuletzt bearbeitet:
comparable wäre die Aufbabe gewesen... Aber ich habe keine Ahnung wie das funktioniert und war auch bei meiner Suche gestern nicht sehr erfolgreich..

Kannst du mir da vielleicht weiterhelfen?

array.sort(studenten) nützt nichts. kommt nur zu Fehlermeldungen...
 
Comparable ist ein interface, das muss die zu sortierende Klasse implementieren und die Methoden überschreiben. Wenn du nicht weißt was ein Interface ist, wie es implementiert wird, oder wie man die Methoden überschreiben muss, lies hier mal nach => http://www.java-blog-buch.de/0408-interfaces/ <= . Die compareTo-Methode des Comparable-Interfaces liefert je nach Übergabeparameter -1 (aufrufendes Element ist höher angesiedelt), 0 (beide Elemente sind gleichwertig) oder 1 (übergebenes Element ist höher angesiedelt) zurück. Detailliert in der JavaDoc nachzulesen => http://java.sun.com/javase/6/docs/api/ <=
 
Erstmal danke für eure Hilfe!

Ich habe jetzt folgendes erstellt

public int compareTo(Object vergleich) {

if (vergleich instanceof Student) {
Student studenten = (Student) vergleich;
if (this.matrikelnr > getMatrikelnr())
return 1;
else if (this.matrikelnr < getMatrikelnr())
return -1;
}
return 0;
}

private String getMatrikelnr(){return matrikelnr;}


Leider ergibt sich aber nun das Problem, das die Matrikelnummer ein String ist, also die Operatoren > < nichts damit anfangen können. Das die Matrielnummer ein String ist, ist aber leider vorgegeben.
 
ich hätte folgendes gefunden, compeliert auch ohne Probleme, nur leider kommt dann bei der Ausführung wieder ein Fehlermeldungsblock

public int compareTo(Object vergleich) {

if (vergleich instanceof Student) {

if (this.matrikelnr.compareTo(getMatrikelnr()) > 0)
return 1;
else if (this.matrikelnr.compareTo(getMatrikelnr()) <0)
return -1;
}
return 0;
}

private String getMatrikelnr(){return matrikelnr;}


Exception in thread "main" java.lang.NullPointerException
at java.util.Arrays.mergeSort(Arrays.java:1144)
at java.util.Arrays.mergeSort(Arrays.java:1156)
at java.util.Arrays.sort(Arrays.java:1079)
at vierteaufbgabe.Studenten_Verwaltung.main(Studenten_Verwaltung.java:41)
Java Result: 1

Also er hat probleme mit arrays.sort(studenten);
 
Du könntest es auch einfach so verkürzen:

Code:
public int compareTo(Object vergleich) {

if (vergleich instanceof Student) {

return this.matrikelnr.compareTo(getMatrikelnr());

}
return 0;
}

Da liegt allerdings noch ein Fehler drin. So vergleichst du die Martikelnummer von ein und demselben Studenten. Es müsste so korrekt heißen:

Code:
public int compareTo(Object vergleich) {

if (vergleich instanceof Student) {

return this.matrikelnr.compareTo(((Student)vergleich).getMatrikelnr());

}
return 0;
}

Eine NullPointerException bedeutet, dass ein Element, auf das du zugreifst, gleich null ist. Siehe auch => http://www.java-blog-buch.de/0503-nullpointerexception/ <=

Außerdem solltest du dir angewöhnen deinen Code ordentlich zu formatieren.
 
Ich hab auch nicht behauptet, dass dadurch die NullPointerException weggeht. Ich hab nur den logischen Teil deines Programms ausgebessert.
 
Zurück