Interface & Comparable

lubi27X

Aktives Mitglied
Hallo zusammen, bräuchte mal wieder etwas Hilfe bei einer Aufgabe.
Ich habe eine abstrakte Klasse "Figur" und zwei Subklassen "Rechteck" und "Kreis", welche von Figur erben. Nun soll ich einen in der Klasse Figur eine Schnittstelle "Comparable" implementieren, so dass sich die Objekte nach Größe der Fläche sortieren lassen.
Die Oberklasse und Unterklasse habe ich soweit, doch meine Sortierung sieh irgendwie hässlich aus..
In Zeile 18 und 19 meiner main-Methode wird mir nur eine 1 oder -1 ausgespuckt. Ich würde gerne eine ordentliche Sortierung haben...
Java:
public abstract class Figur{
    //Abstrakte Methoden
        public abstract void zeichne();
        public abstract double getFlaeche();
}
Java:
public class Kreis extends Figur implements Comparable<Figur> {
    
    //Attribut
    double radius;
    
    //Konstruktor
    Kreis(double radius) {
        this.radius = radius;
    }
    
    @Override
    public void zeichne() {
        System.out.println("Der Radius beträgt " + this.radius + " und die Fläche beträgt " + this.getFlaeche());
    }

    @Override
    public double getFlaeche() {
        return Math.PI * this.radius * this.radius;
    }

    @Override
    public int compareTo(Figur other) {
//        if (this.getFlaeche() > other.getFlaeche())
//        {
//            return (int) this.getFlaeche();
//        }
//        return (int) other.getFlaeche();
        
        return Double.compare(this.getFlaeche(), other.getFlaeche());
    }
}
Java:
public class Rechteck extends Figur implements Comparable<Figur>{
    
    double breite;
    double hoehe;
    
    Rechteck(double b, double h) {
        this.breite = b;
        this.hoehe = h;
    }
    
    @Override
    public void zeichne() {
        System.out.println("Die Breite beträgt: " + this.breite + " die Höhe beträgt: " + this.hoehe + " und die Fläche beträgt: " + this.getFlaeche());
    }

    @Override
    public double getFlaeche() {
        return this.breite * this.hoehe;
    }

    @Override
    public int compareTo(Figur other) {
//        if (this.getFlaeche() > other.getFlaeche())
//        {
//            return (int) this.getFlaeche();
//        }
//        return (int) other.getFlaeche();
        return Double.compare(this.getFlaeche(), other.getFlaeche());
    }
}
Java:
import java.util.Arrays;

public class main {

    public static void main(String[] args) {
        Kreis k1 = new Kreis(5.2);
        Kreis k2 = new Kreis(8.9);
        Rechteck r1 = new Rechteck(14,19);
        Rechteck r2 = new Rechteck(45,99);
        Rechteck r3 = new Rechteck(120,500);
        
        System.out.println("Die Fläche von k1 beträgt: " + k1.getFlaeche());
        k1.zeichne();
        
        System.out.println("Die Fläche von r1 beträgt: " + r1.getFlaeche());
        r1.zeichne();
        
        System.out.println(r1.compareTo(k1));
        System.out.println(k2.compareTo(r2));
        
//        Rechteck[] rck = {r1,r2,r3};
//       
//        Arrays.sort(rck);
//        System.out.println(rck);
    }
}
 

fhoffmann

Top Contributor
In Zeile 18 und 19 meiner main-Methode wird mir nur eine 1 oder -1 ausgespuckt. Ich würde gerne eine ordentliche Sortierung haben...
Eine wirkliche Sortierung musst du dann selber schreiben oder eine fertige Sortierfunktion benutzen.
Wichtig beim Sortieren ist nur, dass das Programm weiß, welches von zwei Elementen größer als das andere ist. Und dafür hast du das Interface "Comparable" implementiert, das genau diese Frage beantwortet.
 

lubi27X

Aktives Mitglied
Das bedeutet, dass ich die Arrays.sort() in meinem Fall nicht einfach benutzen kann, sondern die Methode nochmal neu in meinen Klassen Rechteck und Kreis schreiben muss?
 
K

kneitzel

Gast
Nein, du musst das nicht neu schreiben. Aber das Comparable Interface dient ja nur dazu, um zu sagen: erstes Element ist kleine, gleich oder größer (Im Sinne der Sortierung). Also negativer Wert, 0, positiver Wert als Rückgabe.

Und wenn Du Dir die Klasse Arrays anschaust, speziell die Sort Methode, dann findest Du da:
public static void sort(Object[] a)
Sorts the specified array of objects into ascending order, according to the natural ordering of its elements. All elements in the array must implement the Comparable interface.

Also mit der Implementation von Comparable bist Du jetzt in der Lage, ein Array von Instanzen dieser Klasse mit Arrays.sort zu sortieren.
 

lubi27X

Aktives Mitglied
Jo, habe es jetzt verstanden, danke... Sort() sortiert mir hier alle Objekte aufsteigend anhand der Fläche(So verstehe ich das).

Jetzt kann ich die Werte mit einer for-Schleife ausgeben lassen.

Lediglichdie einzelnen Objekte ausgeben lassen bekomme ich nicht hin.
Ich will, dass da in Zeile 8, bei "Arrays.toString(liste), k1, k2 etc. steht.
Java:
        Figur[] liste = {k1,k2,r1,r2,r3};
        Arrays.sort(liste);
       
        System.out.println(Arrays.toString(liste[2]));
       
        for (int i = 0; i < liste.length; ++i)
        {
            System.out.println("Platz "+ (i + 1) + " ist " + Arrays.toString(liste[i])+ " mit einer Fläche von " + liste[i].getFlaeche());
        }
       
    }
}
 
Zuletzt bearbeitet:
K

kneitzel

Gast
k1, k2 sind ja nur Variablennamen. Die hast Du in dem Array ja nicht mehr.
Du kannst also maximal den Inhalt ausgeben, den Du in der Instanz hast Dazu könntest Du die toString Methode überschreiben.
 

lubi27X

Aktives Mitglied
ah okay..Das bedeutet, dass ich an die Variablennamen jetzt gar nicht mehr ran komme? Wäre halt schön, wenn der variablenname da noch steht und mann weiß um welches Objekt es sich handelt.
 
K

kneitzel

Gast
Du hast die Variable doch gar nicht mehr. Du hast ein Array aus Referenzen. Die Variablen könnten sonst was für neue Werte bekommen:
Java:
Figur[] liste = {k1,k2,r1,r2,r3};
k1 = null;

Die Instanz aus k1 ist in der liste, aber k1 selbst ist null....
Oder was ist wenn Du ein Array aus 5 Elementen hast und dann die Variable k1 nutzt um die ersten zwei Elemente zu setzen ...

Oder Du hast eine Instanz aber k1, k2, k3, k4, k5 enthalten alle eine Referenz auf die Instanz?

Also bitte wirklich differenzieren zwischen Variablen und dem Inhalt. Bei der Anzeige wird einfach nur der Inhalt ausgegeben. Der hat kein Wissen, welche Variablen evtl. darauf verweisen.

Wenn Du so Daten als wichtig empfindest, dann musst Du es entsprechend modellieren. Dann hat die Klasse noch eine Instanzvariable name oder so und dann kannst Du diese ausgeben.
Oder wenn Du einen Zusammenhang von Name auf so eine Instanz brauchst, dann hast Du von mir aus eine Map.
 

Neumi5694

Top Contributor
Vielleicht ist die alte C-Ausdrucksweise mit Zeigern für einen Anfänger etwas leichter verständlich.
Der Kreis selbst (die Instanz) liegt irgendwo im Speicher, die Variable k1 ZEIGT darauf (ist also in Java eine Referenz).
Jedes Feld im Array zeigt ebenfalls auf Kreise.
1. Wenn du die Werte des Arrays änderst (wodurch auch immer), bleiben alle Kreise im Speicher, wo sie sind, nur die Zeiger/Referenzen in den Feldern ändern sich.
2. Wenn du k1 in das Array kopierst, dann wird der Zeiger auf den Kreis reinKOPIERT, k1 und das Array bleiben unabhängig voneinander, d.h.
2.1 fallst du danach k1 änderst, bleibt das Array gleich.
2.2 falls du das Array umsortierst, bleibt k1 gleich.
 

Programmer20

Mitglied
Eine wirkliche Sortierung musst du dann selber schreiben oder eine fertige Sortierfunktion benutzen.
Wichtig beim Sortieren ist nur, dass das Programm weiß, welches von zwei Elementen größer als das andere ist. Und dafür hast du das Interface "Comparable" implementiert, das genau diese Frage beantwortet.
Der Fehler mit dem Sortieren passiert mir auch öfter. Aber wenn man einmal weiß, worauf man achten muss, klappt das mit dem Interface besser! Ist reine Übungssache 💪
 

lubi27X

Aktives Mitglied
Ich habe jetzt in meiner Klasse Kreis und Rechteck das Attribut "name" hinzugefügt und jeder Instanz einen namen "verpasst". Über die for-Schleife gebe ich den Namen zusätzlich aus..
Hat doch noch mit einem einfachen Bauerntrick funktioniert...
 

lubi27X

Aktives Mitglied
Vielleicht ist die alte C-Ausdrucksweise mit Zeigern für einen Anfänger etwas leichter verständlich.
Der Kreis selbst (die Instanz) liegt irgendwo im Speicher, die Variable k1 ZEIGT darauf (ist also in Java eine Referenz).
Jedes Feld im Array zeigt ebenfalls auf Kreise.
1. Wenn du die Werte des Arrays änderst (wodurch auch immer), bleiben alle Kreise im Speicher, wo sie sind, nur die Zeiger/Referenzen in den Feldern ändern sich.
2. Wenn du k1 in das Array kopierst, dann wird der Zeiger auf den Kreis reinKOPIERT, k1 und das Array bleiben unabhängig voneinander, d.h.
2.1 fallst du danach k1 änderst, bleibt das Array gleich.
2.2 falls du das Array umsortierst, bleibt k1 gleich.
Das ist eine super Veranschaulichung....

Wenn ich das richtig verstehe, ändert man nie den Inhalt des Arrays, sondern die Referenzen auf den Inhalt des Arrays.
 

Neumi5694

Top Contributor
Referenzen auf den Inhalt des Arrays? Der Inhalt des Arrays sind Referenzen auf Figuren.
Was du sortierst, sind die Referenzen, die Figuren selbst bleiben im Speicher genau da, wo sie sind.

Nach der Zuweisung liste[0] = k1 zeigen liste[0] und k1 auf die selbe Figur.
k1 = neueFigur1;
liste[0] = k1; //bzw Initialisierung des Arrays mit k1 an der ersten Stelle
sortiere(liste);
Die Referenz aus liste[0] ist durch das Sortieren z.B. nach Position 3 gewandert, jetzt gilt Jetzt gilt k1 == liste[3]

Umgekehrt kannst du z.B. das hier machen.
k1 = neueFigur1;
liste[0] = k1; //bzw Initialisierung des Arrays mit k1 an der ersten Stelle
k1 = neueFigur2;
Es gibt nun im Array überhaupt keine Referenz auf neueFigur2.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
C Comparable Interface Java Basics - Anfänger-Themen 8
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
A Comparable interface Java Basics - Anfänger-Themen 26
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
R Comparable Interface Funktionalität selbst programmieren? Java Basics - Anfänger-Themen 3
A Interface Comparable Java Basics - Anfänger-Themen 2
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
P Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben