String sortieren mit Interface und sort()

stefanpb

Mitglied
Hallo :)

Ich habe eine Hausaufgabe gestellt bekommen und soll ein Programm, dass, mittels eines HasKey Interfaces, Telefon-Objekt-Arrays sortieren kann, erweitern, sodass das ganze auch für "Studenten"-Objekte funktioniert.
Das habe ich, glaube ich, auch soweit alles richtig gemacht, nur bekomme ich es nicht hin, die Studenten nach der Matrikelnummer zu sortieren, die aber auch vom Typ int sein und mit "toString()" in einen String konvertiert werden soll.

Ich sollte vielleicht dazu sagen, dass das sortieren bei den Telefonbucheinträgen wunderbar funktioniert, weshalb ich vermute, dass es an meiner getKey()-Methode bei den Studenten liegt, aber ich komme einfach nicht drauf, wie ich das hinbekomme.

Vielen Dank schonmal für die Hilfe. Hier noch der Aufgabentext:

Erweitern Sie das Programm um eine Klasse "Student" mit 2 Attributen "matrikelnr" und "name", die ebenfalls das HasKey-interface implementiert, indem sie die Matrikelnummer des Studenten als Schlüsselwert (=Key=Sortierkriterium) benutzt. Außerdem soll Ihre Klasse "Student" eine "toString"-Funktion anbieten, um ein "Student"- Objekt in einen String zu konvertieren.
Erweitern Sie Ihre main-Funktion so, dass ein Array mit "Student"-Objekten angelegt wird und mit Hilfe der gegebenen "sort"-Funktion nach Matrikelnummern sortiert wird. (Sie sollen davon ausgehen, dass alle Matrikelnummern die gleiche Stellenanzahl haben, so dass Sie sie direkt in Strings konvertieren können.)
Lassen Sie das sortierte Array von "Student"-Objekten in der main-Funktion ausgegeben.

und das Programm:

Java:
public class Aufgabe1 {
    public static void main (String [] args) {
        Telefon [] telefonbuch = {
            new Telefon("Peter", 12345),
            new Telefon("Anna", 23753),
            new Telefon("Rita", 12314),
            new Telefon("Monika", 44117) };
        sort(telefonbuch);
        Student [] studenten = {
            new Student(12345,"Anna"),
            new Student(12343, "Rolf"),
            new Student(12344, "Emma"),
            new Student(12346, "Bob") };
        sort(studenten);
        ausgeben(telefonbuch);
        System.out.println("-----------------------");
        ausgeben(studenten);
        System.out.println("-----------------------");
    }
    
    static void sort(HasKey [] arr) {
        int left, min, test;
        for(left = 0; left < arr.length-1; left++) {
            min = left;
            for(test = left+1; test < arr.length; test++) {
                if(arr[test].getKey().compareTo(arr[min].getKey()) < 0)
                    min = test;
                tausche(arr, min, left);
            }
        }
    }
 
    static void ausgeben(HasKey [] arr) {
        for(int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    
    static void tausche(HasKey [] arr, int l, int m) {
        HasKey hilf = arr[l];
        arr[l] = arr[m];
        arr[m] = hilf;
    }
}

interface HasKey {
    String getKey();
}

class Student implements HasKey {
    int matrikelnr;
    String name;
    
    Student(int mat, String n) {
        matrikelnr = mat;
        name = n;
    }
    
    public String getKey() {
        return Integer.toString(matrikelnr);
    }
    
    public String toString() {
        return "("+matrikelnr+" : "+ name + ")";
    }
    
}
class Telefon implements HasKey {
    String name;
    int telefonnr;
    
    Telefon (String n, int tel) {
        name = n; telefonnr = tel;
    }
    
    public String getKey() {
        return name;
    }
    
    public String toString() {
        return "("+name+" : "+ telefonnr +")";
    }
    
}
 
S

SlaterB

Gast
deine Sort-Methode geht die Liste nur einmal durch und vertauscht gegebenfalls benachbarte Elemente,
das reicht nur mit Glück bei passenden Listen wie deiner Telefon-Liste (auch nicht mehr mehr wenn du z.B. Anna und Rita vertauschst),
im allgemeinen ist das einfach zu wenig,

wenn du paar mal öfter die Liste durchgehst, dann klappt es in allen Fällen,
schau dir Bubblesort an, wie oft das richtig gemacht sein muss

edit: nanu, jetzt sehe ich zwei Schleifen, das war ja viel zu schnell geantwortet von mir ;),
gleich vielleicht noch Update

edit2: also es ist immer noch deine Sortierung die im argen liegt, aber ganz anders als gedacht,
bei jedem Schritt wird dort getauscht, entweder left mit min = anfangs auch left oder später mit einem höheren Element,
wenn danach kein <= kommt, dann wird eine zufällig gerade oder ungerade Anzahl von Vertauschungen von left und min vorgenommen,
das ist doch ziemlich wirr und ungewiss welches Element am Ende wo landet,

wie ist denn dein konkretes Konzept?
 
Zuletzt bearbeitet von einem Moderator:

stefanpb

Mitglied
Die Sache ist, dass die sort Methode schon vorgegeben war und das wir, so wie ich das verstanden habe, nichts daran ändern sollen.
Ich verstehe einfach nicht, warum das nicht funktioniert. Auch wenn die ints der Matrikelnummer alle eine andere Zahl als erstes haben, werden sie nicht sortiert, das Telefonbuch aber schon.
 
S

SlaterB

Gast
ich hab dir doch gesagt du sollst Anna und Rita vertauschen, dann passiert dort genauso Mist,
nur in bestimmten Ausgangssituationen kommt diese Anti-Sortierung halb zufällig zu einem korrekten Ergebnis, so dass korrektes Verhalten vorgegaukelt wird,

ein Beispiel kann ich dir noch geben:
gegeben seinen die drei Keys b, a, c
beim ersten Durchlauf ist left die erste Position, Index 0, min ebenso,
die innere Schleife beginnt bei Index 1, das test=a dort wird mit min=left=b verglichen, test ist kleiner, deswegen zeigt jetzt min auf Position 1, auf b,
es kommt zum Tausch mit left=0=a, Liste danach ist a, b, c, soweit besser geworden,

dann wandert die innere Schleife eine Position weiter, test ist nun Index 2=c, das if schlägt nicht an,
der Tausch danach wird dennoch ausgeführt, left ist nach wie vor 0, min nach wie vor 1, es werden also wieder die ersten beiden Elemente vertausch: b, a, c, wie am Anfang,
als nächstes wandert die äußere Schleife weiter, damit ist b auf Position 0 besiegelt, nicht mehr veränderbar, obwohl dort a hingehört

auf ähnliche Weise kannst du dir für die 4 Telefone und die 4 Studenten Schritt für Schritt anschauen was passiert,
entweder mit System.out.println() oder eben im Kopf die Regeln durchgehen,

ich bleibe vorerst dabei dass mit dem Key alles stimmt, nur das Sortierverfahren fehlerhaft ist
 

stefanpb

Mitglied
Okay. Das Problem hat sich erledigt, da ich einfach nur einen Abschreibfehler gemacht habe ^^. Blöd sowas.

Jetzt habe ich aber wieder etwas ähnliches und zwar soll ich außerdem noch ein Methode suche() programmieren. Da hab ich jetzt fast wieder das gleiche Problem und zwar liefert die Suche im Telefonbuch das gewünschte Ergebnis, doch wenn ich die suche()-Funktion für Studenten aufrufe, liefert er immer null zurück.
Eine Idee woran das liegen kann?

Danke schonmal :)
Code folgt:

Java:
public class Aufgabe1 {
    public static void main (String [] args) {
        Telefon [] telefonbuch = {
            new Telefon("Peter", 12345),
            new Telefon("Anna", 23753),
            new Telefon("Rita", 12314),
            new Telefon("Monika", 44117) };
        sort(telefonbuch);
        Student [] studenten = {
            new Student(12345,"Anna"),
            new Student(12343, "Rolf"),
            new Student(12344, "Emma"),
            new Student(12346, "Bob") };
        sort(studenten);
        ausgeben(telefonbuch);
        System.out.println("-----------------------");
        System.out.println("Telefonbuch-Suche:\n1. Suche nach Peter\n2. Suche nach Karin (nicht vorhanden)");
        System.out.println((Telefon)(suche(new Telefon("Peter",12345), telefonbuch)));
        System.out.println((Telefon)(suche(new Telefon("Karin",55555), telefonbuch)));
        System.out.println("-----------------------");
        ausgeben(studenten);
        System.out.println("-----------------------");
        System.out.println("Studenten-Suche");
        System.out.println((Student)(suche(new Student(12346,"Bob"), studenten)));
    }
    
    static void sort(HasKey[] arr)
    {
        int left , min , test;
        for (left=0; left < arr.length-1; left++)
        {
            min = left;
            for (test = left+1; test < arr.length; test++)
                if (arr[test].getKey().compareTo(arr[min].getKey()) < 0)
                    min = test;
            tausche(arr, min, left);
        }
    }
    
    static HasKey suche(HasKey obj, HasKey [] arr) {
        for(int n = 0; n < arr.length-1; n++) {
            if(obj.getKey() == arr[n].getKey()) {
                System.out.print("Gefunden! : ");
                return arr[n];
            }
        }
        System.out.print("Nicht gefunden! : ");
        return null;      
    }
    
    static void ausgeben(HasKey [] arr) {
        for(int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    
    static void tausche(HasKey [] arr, int l, int m) {
        HasKey hilf = arr[l];
        arr[l] = arr[m];
        arr[m] = hilf;
    }
}

interface HasKey {
    String getKey();
}

class Student implements HasKey {
    int matrikelnr;
    String name;
    
    Student(int mat, String n) {
        matrikelnr = mat;
        name = n;
    }
    
    public String getKey() {
        return Integer.toString(matrikelnr);
    }
    
    public String toString() {
        return "("+matrikelnr+" : "+ name + ")";
    }
    
}
class Telefon implements HasKey {
    String name;
    int telefonnr;
    
    Telefon (String n, int tel) {
        name = n; telefonnr = tel;
    }
    
    public String getKey() {
        return name;
    }
    
    public String toString() {
        return "("+name+" : "+ telefonnr +")";
    }
    
}
 

Fleur de Soleil

Aktives Mitglied
Auf den ersten Blick ist das Problem, dass du beim Telefonbuch int == int überprüfst, das klappt auch. Bei den Studenten überprüfst du aber String == String und das geht nicht. Strings werden mit string1.equals(string2) verglichen
 
S

SlaterB

Gast
String unbedingt mit equals vergleichen, nicht mit ==,
bei Telefon geht das noch da du überall Konstanten vorgibts, bei Student wird der String aber berechnet,
jedes neue Objekt ist nicht == den gleichen,
(dasselbe vs das gleiche)

speziell für Bob hast du aber noch ein anderes Problem,
in der Hoffnung dass du was lernst solche Probleme selber zu finden:
Log Log Log!
Java:
    static HasKey suche(HasKey obj, HasKey[] arr) {
        System.out.println("ich will wissen was mein Programm für mich tut, hier die Suche:");
        for (int n = 0; n < arr.length - 1; n++)  {
            System.out.println("prüfe Index " + n + ", Eintrag: " + arr[n].getKey() + 
                 ", Vergleichswert ist " + obj.getKey());
            if (obj.getKey() == arr[n].getKey())  {
                System.out.print("Gefunden! : ");
                return arr[n];
            }
        }
        System.out.print("Nicht gefunden! : ");
        return null;
    }
eine Schleifenvariable n ist übrigens unschön, n ist meist irgendeine Anzahl,
für Schleifen besser i, j, k usw.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
scratchy1 Array sortieren und dann String-Repräsentation ausgeben Java Basics - Anfänger-Themen 2
J String, Int und double Array sortieren Java Basics - Anfänger-Themen 16
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
informatikschüler21 String im Array sortieren Java Basics - Anfänger-Themen 4
C Chars in einem String alphabetisch sortieren Java Basics - Anfänger-Themen 1
S String nach Größe sortieren Java Basics - Anfänger-Themen 6
Todesbote Map (Key=String; Value = Vector) Value/Vector sortieren Java Basics - Anfänger-Themen 13
J Klassen java.lang.String - lexikographisches Sortieren Java Basics - Anfänger-Themen 5
T Sortieren/Suche klappt nicht ganz (String Array) Java Basics - Anfänger-Themen 2
P String Sortieren in einem Array Java Basics - Anfänger-Themen 7
K zahlenwerte im Typ string vergleichen/sortieren Java Basics - Anfänger-Themen 3
M ArrayList<String> alphabetisch sortieren Java Basics - Anfänger-Themen 5
A String-Array lexikographisch sortieren Java Basics - Anfänger-Themen 6
S LinkedList<String[]> filtern und sortieren Java Basics - Anfänger-Themen 9
L Einzeiler - String Array sortieren Java Basics - Anfänger-Themen 16
R Sortieren eines 2-dim String Arrays Java Basics - Anfänger-Themen 4
D String nach ABC sortieren Java Basics - Anfänger-Themen 2
P Zahlen aus String auslesen und dann sortieren. Java Basics - Anfänger-Themen 2
S Arrays nach String kovertieren und sortieren Java Basics - Anfänger-Themen 4
J String - einzelne Zeichen sortieren Java Basics - Anfänger-Themen 14
V Zahlen sortieren und String zuweisen Java Basics - Anfänger-Themen 7
R Tabelle sortieren, Problem mit Double bzw. String-Werten Java Basics - Anfänger-Themen 5
R String-Array sortieren Java Basics - Anfänger-Themen 12
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
T String splitten Java Basics - Anfänger-Themen 3
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
T Platzhalter in String? Java Basics - Anfänger-Themen 14
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
R Ein Multidimensionales String Array initialisieren und Deklarieren Java Basics - Anfänger-Themen 2
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
C String/Char-API Java Basics - Anfänger-Themen 13
U Char zu einem String machen Java Basics - Anfänger-Themen 1
B Anzahl Nullen uns Einsen in String ermitteln Java Basics - Anfänger-Themen 3
T Leerzeichen im String entfernen Java Basics - Anfänger-Themen 6
Jose05 Nullpointerexception bei Umwandlung von String zu int Java Basics - Anfänger-Themen 2
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben