Interface Comparable für Server-Item-Interface

innoc

Aktives Mitglied
Hallo,

ich versuche ein lauffähiges Beispiel für ein Server/Item-Interface basierend auf Comparable<T> zu finden. Vom Prinzip her soll ein Client einem Server Instanzen untereinander vergleichbarer Items zum Sortieren übergeben. Da es keinen Sinn macht die Item-Referenzen direkt zu vergleichen, habe ich für die Item-Objekte ein Attribut Name vom Typ String vorgesehen. Dieses Attribut soll für die Sortierung herhalten. Um die Vorgaben umzusetzen, habe ich mir folgenden Programmcode überlegt:
Java:
import java.util.*;

interface Comparable<Object> {
  int compareTo(Object o);
}

class Item implements Comparable {
  String name;

  Item(String name) {
    this.name = name;
  }

  public int compareTo(Item item) {
    return name.compareTo(item.name);
  }
}

class Server {

  void sort(List<? extends Comparable> items) {
    Iterator<? extends Comparable> it = items.iterator();
    Item a = it.next();
    while(it.hasNext()) {
      Item b = it.next();
      if (b.compareTo(a) < 0) {
        a = b;
      }
    }
  }

}

public class Client {
  Server server;
  List<Comparable> items = new ArrayList<Comparable>();
  items.add(new Item("Lion"));
  items.add(new Item("Tiger"));
  items.add(new Item("Cat"));
  server.sort(items);
}

Beim Kompilieren bekomme ich dann eine Fehlermeldung, dass er in items.add(new Item(Stringwert)) einen Identifier erwartet. Das verstehe ich nun nicht, denn Item ist doch der Identifier oder? Ich vermute, dass der Fehler im Aufruf der compareTo-Methode in dem if-Statement der Klasse Server liegt und ich die Zuordnung der Item-Objekte an die Variablen a und b in der Klasse Server im Programm nicht berücksichtigt habe, habe aber momentan keinen Plan, wie ich das ändern kann. Hat da jemand eine Idee?
 

jgh

Top Contributor
mal von anderen "Problemen" abgesehen:

[java=34]
public class Client {
Server server;
List<Comparable> items = new ArrayList<Comparable>();

public Client() {
items.add(new Item("Lion"));
items.add(new Item("Tiger"));
items.add(new Item("Cat"));
server.sort(items);
}
// oder halt in einer Methode
public void addNewItems() {
items.add(new Item("Lion"));
}

}
[/code]
dann klappt es auch mit dem adden der new Item("wasAuchImmer");
 
Zuletzt bearbeitet:

Ariol

Top Contributor
Du rufst Methoden direkt in der Klasse auf.
Das geht nur zum Initialisieren von Attributen, aber nicht so.

Ich vermute mal, dass du eher das hier wolltest:
Java:
import java.util.*;

class Item implements Comparable<Item> {
	String name;

	Item(String name) {
		this.name = name;
	}

	public int compareTo(Item item) {
		return name.compareTo(item.name);
	}
	
	@Override
	public String toString() {
		return "ITEM(" + name + ")";
	}
}

class Server {
	<I extends Comparable<I>> void sort(List<I> items) {
		Iterator<I> it = items.iterator();
		I a = it.next();
		while (it.hasNext()) {
			I b = it.next();
			if (b.compareTo(a) < 0) {
				a = b;
			}
		}
	}
}

public class Client {
	Server server;
	List<Item> items;

	public Client() {
		this.server = new Server();
		this.items = new ArrayList<Item>();
	}

	public void doit() {
		items.add(new Item("Lion"));
		items.add(new Item("Tiger"));
		items.add(new Item("Cat"));
		server.sort(items);
		System.out.println(items);
	}

	public static void main(String[] args) {
		new Client().doit();
	}
}

Aber dein Sortieralgorithmus funktioniert so noch nicht ;)
 

innoc

Aktives Mitglied
Danke für den Tip von jgh. Dadurch habe ich zumindest eine kompilierbare Version hinbekommen. Diese sieht jetzt wie folgt aus:
Java:
import java.util.*;

interface Comparable<Object> {
  int compareTo(Object o);
}

class Item implements Comparable<Item> {
  String name;

  Item(String name) {
    this.name = name;
  }

  public int compareTo(Item item) {
    return (name.compareTo(item.name));
  }
}

class Server {

  void sort(List<? extends Comparable> items) {
    Iterator it = items.iterator();
    Item a = (Item)it.next();
    while(it.hasNext()) {
      Item b = (Item)it.next();
      if (b.compareTo(a) < 0) {
        a = b;
      }
    }
  }

}

public class Client {
  Server server;
  List<Comparable> items = new ArrayList<Comparable>();
 
  public Client() {
      items.add(new Item("Lion"));
      items.add(new Item("Tiger"));
      items.add(new Item("Cat"));
      server.sort(items);
  }  
}

Den Vorschlag von Ariol konnte ich mir noch nicht ansehen, hole ich nach.
 

Ariol

Top Contributor
Der Server sollte doch eigentlich nichts von der Items-Klasse wissen, oder?
Dann darfst du dort auch nicht nach Item casten.
 

innoc

Aktives Mitglied
Danke Ariol für diesen Einwand. Den Cast habe ich eingefügt, nur um das Programm kompiliert zu bekommen. Dies steht natürlich im Gegensatz zu der Idee Item, Server und Client zu trennen und dadurch maximale Flexibilität zu erhalten. Durch <? extends Comparable> in Server ernte ich allerdings Kompiler-Beschwerden. Dein Vorschlag konnte ich mir allerdings bisher noch nicht zu Gemüte führen (wg. Job :( ).
 

Ariol

Top Contributor
Ok,

mein Vorschlag ist noch etws spezifischer, aber da Item ja von Comparable erbt kannst du das hier verwenden:

Java:
Comparable a = it.next();

;)
 

innoc

Aktives Mitglied
Hallo Ariol,

Dein Vorschlag ist super, das hat mir doch sehr geholfen, vielen Dank dafür. Was ich nicht verstehe ist, warum Du toString() in Item überschreibst. Was noch fehlt ist, dass der Sortieralgorithmus nicht funktioniert. Da muss ich noch etwas grübeln.
Aktuell sieht der Programmcode so aus:
Java:
import java.util.*;

interface Comparable<Object> {
  int compareTo(Object o);
}

class Item implements Comparable<Item> {
  String name;

  Item(String name) {
    this.name = name;
  }

  public int compareTo(Item item) {
    return (name.compareTo(item.name));
  }
}

class Server {

  <I extends Comparable<I>> void sort(List<I> items) {
    Iterator<I> it = items.iterator();
    I a = it.next();
    while(it.hasNext()) {
      I b = it.next();
      if (b.compareTo(a) < 0) {
        a = b;
      }
    }
  }

}

public class Client {
  Server server;
  List<Item> items;
 
  public Client() {
    this.server = new Server();
    this.items = new ArrayList<Item>();
  }

  public void doIt() {
    items.add(new Item("Lion"));
    items.add(new Item("Tiger"));
    items.add(new Item("Cat"));
    server.sort(items);
    for (Item item : items) {
      System.out.println(item.name);
    }
  }

  public static void main(String[] args) {
    new Client().doIt();
  }
  
}

Vielleicht hat ja jemand noch ein Tipp warum die Sortierung nicht klappt. Die Methode sort() ist ja an sich ok, evtl. ein pass-by-copy-Problem?
 

Ariol

Top Contributor
Hallo Ariol,

Dein Vorschlag ist super, das hat mir doch sehr geholfen, vielen Dank dafür. Was ich nicht verstehe ist, warum Du toString() in Item überschreibst.
...
Wenn
Code:
toString
einer Klasse überschrieben ist, die in eine Liste gesteckt wird, kann man diese Liste direkt über
Code:
System.out.println()
ausgeben. War nur um keine eigene for-Schleife schrieben zu müssen. ;)


...
[JAVA=20]
...
<I extends Comparable<I>> void sort(List<I> items) {
Iterator<I> it = items.iterator();
I a = it.next();
while(it.hasNext()) {
I b = it.next();
if (b.compareTo(a) < 0) {
a = b;
}
}
}

}
[/code]

Vielleicht hat ja jemand noch ein Tipp warum die Sortierung nicht klappt. Die Methode sort() ist ja an sich ok, evtl. ein pass-by-copy-Problem?


Du änderst ja nichts an der Liste. Geht es dir eigentlich darum selbst zu sortieren oder überhaupt nur darum, dass die Liste sortiert ist?

Im 2ten Fall hilft dir
Code:
Collections.sort()
.
 

innoc

Aktives Mitglied
Vorerst möchte ich nur die Liste sortieren.
Was mir beim weiteren Herumprobieren an dem Programm aufgefallen ist:
1. So wie meine Sortierfunktion aufgebaut ist, geht wohl ein Wert in der Liste verloren. Wegen a = b zeigen im letzten Durchlauf der if-Schleife die Variablen a und b auf die gleiche Referenz. Ich muss da wohl eher swappen.
Zumindest mit nachfolgendem Code bekomme ich einen Hinweis, dass es mit dem Sortieren dadurch funktioniert (die Server-Klasse habe ich zur Vereinfachung hier weggelassen):
Java:
import java.util.*;

class Item implements Comparable<Item> {
  String name;

  Item(String name) {
    this.name = name;
  }

  public int compareTo(Item item) {
    return (name.compareTo(item.name));
  }
}


public class BubbleSort {

    static void sort(ArrayList<Item> items) {
      int pass = 0;
      Iterator<Item> it = items.iterator();
      Item a = it.next();
      while(it.hasNext()) {
        Item b = it.next();
        if (b.compareTo(a) < 0) {
          Item temp = a;
          a = b;
          b = temp;
        }
        pass++;
        System.out.println(pass + ". Pass: Variable a: " + a.name);
        System.out.println(pass + ". Pass: Variable b: " + b.name);
      }
    }

 
  public static void main (String[] args) {
    ArrayList<Item> items = new ArrayList<Item>();
    Item lion = new Item("2:Lion");
    Item cat = new Item("1:Cat");
    Item tiger = new Item("3:Tiger");
    items.add(lion);
    items.add(tiger);
    items.add(cat);
    sort(items);
  }

}
2. Dass die Liste in der Client-Klasse nach dem Aufruf der Methode sort() sich nicht ändert, liegt meines Erachtens wohl daran, dass in dem Programm nirgends eine Umordnung der Liste angestossen wird. Dabei ist mir momentan noch unklar, ob das nur über das Befüllen einer zweiten Liste geht, oder ob es doch eine Funktion gibt, die mir meine ursprüngliche Liste neu sortiert.
3. Verstehe ich nicht, wie Server die Liste sortieren kann, ohne das Attribut name von Item zu kennen.
Es wäre super, wenn mir da jemand auf die Sprünge helfen könnte.
 

Ariol

Top Contributor
1+2: Richtig, du musst swappen. Zusätzlich musst du aber auch die Werte in der Liste ändern.
3: Genau


Aktuell legst du dir lokale referenzen an, die du dann mit jeweils der anderen Referenz überschreibst.
Dabei bleibt die Liste unangetastet.

Verwende statt eines Iterators lieber
Code:
for(int i = 0; i < list.length(); i++)
...
Wenn man sich die Sourcen der Collectionsklasse ansieht, kann man entdecken, dass die zuerst aus der Liste ein Array machen, das sortieren und anschließend die Liste mit den sortierten Werten befüllen.
Je nach Aufbau der Liste ist dieser Schritt sinnvoll (z.B. LinkedList), weil der Zugriff über den Index langsamer werden kann als ein einmaliges Kopieren.
 

innoc

Aktives Mitglied
Im Prinzip ist es ja nicht so schwer die Liste mit Collections.sort() zu sortieren. Als Server/Item-Implementation sieht das wohl dann wie folgt aus:
Java:
import java.util.*;

class Item implements Comparable<Item> {
  String name;

  Item(String name) {
    this.name = name;
  }

  public int compareTo(Item item) {
    return name.compareTo(item.name);
  }
}

class Server {

  <I extends Comparable<I>> void sort(List<I> items) {
    Collections.sort(items);    
  }

}


class Client3 {
  public static void main(String[] args) {
    List<Item> items = new ArrayList<Item>();
    Server server = new Server();
    items.add(new Item("Lion"));
    items.add(new Item("Tiger"));
    items.add(new Item("Cat"));
    server.sort(items);
    for (Item item : items) {
      System.out.print(item.name + " ");
    }
  }  
}

Collections.sort() in der Server-Klasse kann man in dem obigen Beispiel auch ersetzen:
Java:
...
class Server {

  <I extends Comparable<I>> void sort(List<I> items) {
    Object[] a = items.toArray();
    Arrays.sort(a);
    ListIterator<I> i = items.listIterator();
    for (int j=0; j<a.length; j++) {
      i.next();
      i.set((I)a[j]);
    }
  }

}
...

Ursprünglich wollte ich ja die folgende allgemeine Struktur des Programms umsetzen, die wie folgt lautet:
Java:
interface Comparable {
  int compareTo(Object o);
}

class Item implements Comparable {
  
  ...

  public int compareTo(Item item) {
    ...
  }
}

class Server {

  void sort(List<? extends Comparable> items) {
    ...
    if (b.compareTo(a) < 0) {
        ...;
    }
  }

}

public class Client {
  Server server;
  List<Comparable> items;
  ...
    server.sort(items);
  ...  
}

Das setzt voraus, dass ich in
Java:
...
 if (b.compareTo(a) < 0) {
        ...;
    }
 ...
meinen eigenen Sortieralgorithmus implementiere. Das ist leider nicht so einfach, wie ich mir das am Anfang vorgestellt habe. Vielleicht hat da ja jemand noch einen Vorschlag. Andernfalls kann ich ja den einfachen Weg über die Java-Bibliothek gehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
L Interface & Comparable Java Basics - Anfänger-Themen 15
I Generics und Comparable Java Basics - Anfänger-Themen 14
O Comparable Generic Java Basics - Anfänger-Themen 24
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
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
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
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
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
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
C Comparable Interface Java Basics - Anfänger-Themen 8
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
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
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
J Probleme mit Comparable, compareTo() Java Basics - Anfänger-Themen 2
A Comparable interface Java Basics - Anfänger-Themen 26
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
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
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
R Comparable Interface Funktionalität selbst programmieren? Java Basics - Anfänger-Themen 3
A Interface Comparable Java Basics - Anfänger-Themen 2
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
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
G Icon für App Java Basics - Anfänger-Themen 1
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
M GUI für Vier-Gewinnt. Java Basics - Anfänger-Themen 4
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
Ostkreuz Counter für Booleanwerte Java Basics - Anfänger-Themen 8
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
M generate Methode für Streams Java Basics - Anfänger-Themen 6
I Datenmodell für "Tags" Java Basics - Anfänger-Themen 6
Lion.King for-Kontrollstruktur für Pyramide Java Basics - Anfänger-Themen 8
B Mit Countdown Midnestdauer für Teilaufgabenerledigung erzwingen Java Basics - Anfänger-Themen 8
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
javamanoman Java für Online Banking Java Basics - Anfänger-Themen 12
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
I SQL / JPA Query für StartDate und EndDate Java Basics - Anfänger-Themen 1
T getMethode für ein Array Java Basics - Anfänger-Themen 2
Fats Waller Farben mixen für den Hintergrund ? Java Basics - Anfänger-Themen 1
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
N Api nur für Textdatein (.txt) Java Basics - Anfänger-Themen 2
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben