Comparable Interface

C

ComparableI

Gast
Hi,

geben sind die folgenden Klassen:

Java:
public class Human {
	public String name;
	public int weight;
	public Occupation occupation;
}

und

Java:
public class Occupation {
	public String name;
	public double salary;
}

Man soll nun beide Klassen so verändern, dass eine Liste von
Code:
Human
mit
Code:
Collections.sort()
sortiert werden und zwar einmal aufsteigend nach dem
Code:
salary
des Berufs eines Menschen und einmal absteigend nach dem
Code:
weight
des Menschen.

Mein Versuch:

Java:
public class Occupation implements Comparable<Occupation> {

	public String name;
	public double salary;

	@Override
	public int compareTo(Occupation o) {
		if (o == null)
			throw new NullPointerException("Passed argument is null.");

		if (this.salary == o.salary)
			return 0;
		else if (this.salary < o.salary)
			return -1;
		else
			return 1;
	}

}


Java:
public class Human implements Comparable<Human> {

	public String name;
	public int weight;
	public Occupation occupation;

	@Override
	public int compareTo(Human human) {
		if (human == null)
			throw new NullPointerException("Nullobjekt übergeben.");

		if (this.weight == human.weight)
			return 0;
		else if (this.weight > human.weight)
			return -1;
		else
			return 1;
	}
}

Mein Problem ist nun folgendes. Wenn ich eine Testklasse schreibe und
Code:
Collections.sort
aufrufe, wird nur nach
Code:
size
sortiert.

Das ist mein Code und die Ausgabe unten.

Java:
package klausur;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class HumanTest {

	public static void main(String[] argv) {

		List<Human> humans = new ArrayList<Human>();

		Human human = new Human();
		human.name = "Eike";
		Occupation occupation = new Occupation();
		occupation.name = "Beruf 1";
		occupation.salary = 45000;
		human.occupation = occupation;
		human.weight = 88;

		humans.add(human);

		human = new Human();
		human.name = "Dirk";
		occupation = new Occupation();
		occupation.name = "Beruf 2";
		occupation.salary = 35000;
		human.occupation = occupation;
		human.weight = 72;

		humans.add(human);

		human = new Human();
		human.name = "Andrea";
		occupation = new Occupation();
		occupation.name = "Beruf 3";
		occupation.salary = 40000;
		human.occupation = occupation;
		human.weight = 59;

		humans.add(human);

		human = new Human();
		human.name = "Arne";
		occupation = new Occupation();
		occupation.name = "Beruf 4";
		occupation.salary = 82000;
		human.occupation = occupation;
		human.weight = 88;

		humans.add(human);

		human = new Human();
		human.name = "Minka";
		occupation = new Occupation();
		occupation.name = "Beruf 5";
		occupation.salary = 54000;
		human.occupation = occupation;
		human.weight = 88;

		humans.add(human);

		for (Human p : humans)
			System.out.println(p.name + "\t" + p.occupation.name + "\t"
					+ p.occupation.salary + "\t" + p.weight);

		Collections.sort(humans);

		System.out.println("\nNun sortiert:\n");

		for (Human p : humans)
			System.out.println(p.name + "\t" + p.occupation.name + "\t"
					+ p.occupation.salary + "\t" + p.weight);

	}

}

Ausgabe:


Eike Beruf 1 45000.0 88
Dirk Beruf 2 35000.0 72
Andrea Beruf 3 40000.0 59
Arne Beruf 4 82000.0 88
Minka Beruf 5 54000.0 88

Nun sortiert:

Eike Beruf 1 45000.0 88
Arne Beruf 4 82000.0 88
Minka Beruf 5 54000.0 88
Dirk Beruf 2 35000.0 72
Andrea Beruf 3 40000.0 59


Frage: Wie bekomme ich denn eine Sortierung aufsteigend nach
Code:
salary
nun hin, so wie es verlangt ist? Ich darf nur das Interface
Code:
Comparable
verwenden.
 
G

Gast2

Gast
Wenn du unterschiedliche Sortierungen haben willst brauchst du Comparator, für jede Sortierung einen. Also einen SalaryComparator und einen WeightComparator.

Diesen Comparator kannst du dann der sort Methode übergeben.

Java:
Collections.sort(humans, new SalaryComparator());
 
N

nillehammer

Gast
Java:
    @Override
    public int compareTo(Human human) {
        if (human == null)
            throw new NullPointerException("Nullobjekt übergeben.");
 
        if (this.weight == human.weight)
            return 0;
        else if (this.weight > human.weight)
            return -1;
        else
            return 1;
    }
Du bist selsbt Schuld. In der compareTo-Methode von Human berücksichtigst Du die salary seiner Occupation garnicht. Schreibe sie so um:
Java:
    @Override
    public int compareTo(Human human) {
        if (human == null)
            throw new NullPointerException("Nullobjekt übergeben.");

        final int salaryRestult = this.occupation.compareTo(human.occupation);

        // Wenn  die Salaries unterschiedlich sind, biste fertig. Returne das Ergebnis
        if (salaryResult != 0) {

          return salaryResult;
        }
 
        // Nur, wenn die Salaries gleich sind, ist die Auswertung des zweiten Sortierkriteriums
        // nötig:
        if (this.weight == human.weight)
            return 0;
        else if (this.weight > human.weight)
            return -1;
        else
            return 1;
    }
[EDIT]
Man soll nun beide Klassen so verändern, dass eine Liste von Human mit Collections.sort() sortiert werden und zwar einmal aufsteigend nach dem salary des Berufs eines Menschen und einmal absteigend nach dem weight des Menschen.
Die Formulierung ist recht unglücklich, weil sie die unabhängige Sortierung nach den genannten Kriterien nahelegt. Der Constraint "verwende Comparable" lässt dieses aber nicht zu, da man ja nur eine compareTo-Methode haben kann, die halt irgendwie auch nur eine Sortierreihenfolge ergeben kann. Insofern verstehe ich die Aufgabe so: Implementiere eine sortierung zunächst nach Salary (aufsteigend) und dann nach weight (absteigend). Auf dieser Annahme basiert meine Antwort.

Zur Möglichkeit der Definition verschiedener unabhängiger Sortierkriterien siehe EikeB's Post.
[/EDIT]
[EDIT]Habe meine Antwort nach SlaterB's Hinweis korrigiert (hatte erst nicht so genau gelesen und Salary statt "Salary seiner Occupation" geschrieben.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
> Mein Problem ist nun folgendes. Wenn ich eine Testklasse schreibe und Collections.sort aufrufe, wird nur nach size sortiert.

'size' taucht in deinem Posting sonst nirgendwo auf, du meinst wohl weight,

in compareTo(Human human) musst du als erstes die beiden occupation-Objekte vergleichen, deren compareTo() nutzen

edit:
> In der compareTo-Methode von Human berücksichtigst Du seine Salary garnicht.

oh, bisschen ungenau, Human hat kein salary ;)

edit2:
wenn wirklich nach beiden Kriterien sortiert werden soll, wäre es wäre sinnvolll, nicht nur unterschiedliche Gehälter in den Testobjekten zu haben
 
Zuletzt bearbeitet von einem Moderator:
C

ComparableI

Gast
An den
Code:
Comparator
dachte ich auch, ist ja klar. Ich verstehe die Aufgabe so, dass nach dem Gehalt zuerst sortiert wird und bei Gleichheit nach der Größe.

Bei der Umsetzung hapert es. :D
 

Christiano

Neues Mitglied
Hi,

du kannst die 2 Kriterien folgendermassen einnisten:

* *public int compareTo(Human human){
* * * *
* * * *if (human == null)
* * * * * *throw new NullPointerException ("passed argument is null.");
* * * *
* *
* * * *if (this.occupation.salary==human.occupation.salary) * *
* * * * * *
* * * * * *if (this.weight == human.weight)
* * * * * * * *
* * * * * * * *return 0;
* * * *
* * * * * *else if *(this.weight < human.weight)
* * * * * * * *return 1;
* * * * * *
* * * * * *else return -1;
* *
* * * *else if (this.occupation.salary<human.occupation.salary) * *
* * * * return -1;
* * * *
* * * *else return 1;
* * * *
* *}
 
B

bygones

Gast
@Christiano.

nette * aber fuer code gibts - wie der nette rote dicke Hinweis es sagt - die [ java ] tags....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
L Interface & Comparable Java Basics - Anfänger-Themen 15
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
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
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
I Generics und Comparable Java Basics - Anfänger-Themen 14
O Comparable Generic Java Basics - Anfänger-Themen 24
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
K Comparable - Objekte aus Array vergleichen und größtes auswählen Java Basics - Anfänger-Themen 1
Shizmo Frage zu Comparable Java Basics - Anfänger-Themen 4
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
F Comparable mit String Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
F Objekte sortieren mit Comparable Java Basics - Anfänger-Themen 9
R Mehrere Interfaces(Comparable, ...) Java Basics - Anfänger-Themen 2
B Comparable & Comparator Java Basics - Anfänger-Themen 9
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
J Probleme mit Comparable, compareTo() Java Basics - Anfänger-Themen 2
P Comparable und Generics Java Basics - Anfänger-Themen 6
S comparable und equals Java Basics - Anfänger-Themen 7
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
S Comparable Java Basics - Anfänger-Themen 4
H Comparable und Comparator Java Basics - Anfänger-Themen 22
S instanceof Comparable...geht nicht? Java Basics - Anfänger-Themen 20
M comparable funktion & reverse funktion Java Basics - Anfänger-Themen 8
H Mehrere Comparable Java Basics - Anfänger-Themen 4
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
D Comparable - Bucketsort / Radixsort? Java Basics - Anfänger-Themen 2
B Mehrere Werte mit Comparable sortieren Java Basics - Anfänger-Themen 14
S String umwandeln in Comparable Java Basics - Anfänger-Themen 6
J Comparable Java Basics - Anfänger-Themen 9
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
frau-u Wie vergleicht Comparable Java Basics - Anfänger-Themen 2
M Comparable - Bedingung erzwingen Java Basics - Anfänger-Themen 3
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

Ähnliche Java Themen

Neue Themen


Oben