Portal > Foren > Java > Allgemeine Java-Programmierung > Implementierung des Comparable Interfaces
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 23.11.2005, 13:51 Nach oben    #1
ibs
Benutzer
 
Registriert seit: 23.11.2005
Ort: Aachen
Beiträge: 31
Standard Implementierung des Comparable Interfaces

Hallo!

Irgendwie versuche ich gerade das Comparable Interface zu implementieren und irgenwie klappt es nicht, was mache ich falsch?

Code:
public class Buch implements Comparable{
 String autor;
 public Buch(String a){
  System.out.println(a);  
 }
 public int compareTo(Buch b) {
  return autor.compareTo(b.getAutor());
 }
 public String getAutor() {
  return autor;
 }
 public void setAutor(String autor) {
  this.autor = autor;
 }
 
}
ibs ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.11.2005, 14:00 Nach oben    #2
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

compareTo muss als Parmeter ein Object akzeptieren, um das Interface zu implementieren.
Code:
public int compareTo( Object o) {
  if ( ! (o instanceof Buch) throw new IllegalArgumentException( "Expected Buch, got " + o);

 return autor.compareTo( ((Buch)o).autor);
}
Murray ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.11.2005, 14:26 Nach oben    #3
ibs
Benutzer
 
Registriert seit: 23.11.2005
Ort: Aachen
Beiträge: 31
Standard

Vielen Dank! Nun habe ich aber das nächste Problem! Ich wollte dieses Buch in eine ArrayList einfügen und dann sortiert wieder auslesen!

Code:
import java.util.ArrayList;
import java.util.Collections;
 
public class Sortieren{
 public static void main(String[] args) {
  ArrayList<Buch> s = new ArrayList<Buch>();
  Buch st = new Buch("delta");
  Buch st1 = new Buch("aber");
  Buch st2 = new Buch("beta");
  s.add(st);
  s.add(st1);
  s.add(st2);
  Collections.sort(s);
  
  for (Object r:s){
   System.out.println(r);
  }
 } 
}
Soweit so gut, aber beim Starten erhalte ich folgende Fehlermeldung (Zeile 13: return autor.compareTo(((Buch)o).getAutor()) :

Exception in thread "main" java.lang.NullPointerException

at scjp.Buch.compareTo(Buch.java:13)

at java.util.Arrays.mergeSort(Unknown Source)

at java.util.Arrays.sort(Unknown Source)

at java.util.Collections.sort(Unknown Source)

at scjp.Sortieren.main(
Sortieren.java:16)

ibs ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.11.2005, 14:35 Nach oben    #4
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Problem: Du übergibst in der Klasse Buch im Konstruktor zwar einen String, weist ihn aber nicht dem Field zu:

Besser:
Code:
public Buch( String a) {
  setAutor( a);
}
Jetzt könnte man noch im setAutor() prüfen, ob jemand null übergibt; dann könnte man eine IllegalArgumentException werfen.

Alternativ könnten man auch im compareTo abfragen, ob in beiden Objekten der String auch korrekt zugewiesen wurde.
Murray ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.11.2005, 17:42 Nach oben    #5
ibs
Benutzer
 
Registriert seit: 23.11.2005
Ort: Aachen
Beiträge: 31
Standard

Nun noch eine Frage! Wenn ich jetzt statt dem Comparable Interface, das Comparator Interface benutzte, ist es dann sinnvoll die compare()-Methode in der Klasse Buch zu implementieren oder wäre es sinnvoller dies außerhalb zu tun, sprich ein separates Objekt dafür zu erstellen, das ich dann an die sort()-Methode übergebe? Untenstehend mein Versuch! Ist es so sinnvoll?


Code:
 
import java.util.Comparator;
public class Buch implements Comparator{
 String autor;
 public Buch(String a){
  setAutor( a);  
 }
 
 public String getAutor() {
  return autor;
 }
 public void setAutor(String autor) {
  this.autor = autor;
 }
 public int compare(Object o1, Object o2) {
  return (((Buch)o1).getAutor().compareTo(((Buch)o2).getAutor()));
 } 
}

 
public class Sortieren{
 public static void main(String[] args) {
  ArrayList s = new ArrayList();
  Buch st = new Buch("delta");
  Buch st1 = new Buch("aber");
  Buch st2 = new Buch("beta");
  s.add(st);
  s.add(st1);
  s.add(st2);
  Collections.sort(s, st);
  
  for (Object r:s){
   System.out.println(((Buch)r).getAutor());
  }
 } 
}
ibs ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.11.2005, 18:05 Nach oben    #6
Erfahrener Benutzer
 
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
Standard

den Comperator solltest du in eine eigene klasse auslagern...
z.b. BuchComperator.

der vorteil vom comparator ist, das man die klasse nicht mit methoden belastet, die eigentlich nichts mit ihrer aufgabe zu tun haben...

unter java5 sollte der Comparator etwa so aussehen...
Code:
public class BuchComperator implements Comparator<Buch> {
public int compare(Buch o1, Buch o2) {
	// den vergleich machen
	return 0;
}
}
und in älteren versionen
Code:
public class BuchComperator implements Comparator{
public int compare(Object o1,Object o2) {
	// den vergleich machen
	return 0;
}

}

der sortier vorgang sieht dann so aus
Code:
 Collections.sort(bookCollection,new BookComparator());
oder
Code:
 Arrays.sort(bookArray,new BookComparator());
beny_mcde ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Aktualisierung des Forenplugins vBSEO auf Version 3.0.0 gold Ben Ankündigungen 7 30.05.2007 13:59
Pong Klon hii Allgemeine Java-Programmierung 0 07.08.2005 08:25
Koordinate des Mausklicks erfahren `B Desktop-Applikationen und Grafik 1 25.07.2004 14:24


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45