Comparable Generic

ocsme

Top Contributor
Hallo,

ich verstehe nicht wieso hier ein Laufzeitfehler kommt.
Der Code:
Java:
import java.util.*;
public class Pair<X extends Comparable<X>,Y> {
    public X first;
    public Y second;
  
    public Pair() {
      
    }
  
    public Pair(X x, Y y) {
        first = x;
        second = y;
    }
  
    public int compareTo(Pair<X,Y> p) {
        return first.compareTo(p.first);
    }


public static void main(String[] args) {
      
        TreeSet<Pair<Integer,Integer>> ts = new TreeSet<Pair<Integer,Integer>>();
        Pair<Integer,Integer> p1 = new Pair<Integer,Integer>(1,2);
        ts.add(p1);
        System.out.println(ts.toString());      
    }
  
}

Die Exception:
Java:
Exception in thread "main" java.lang.ClassCastException: Pair cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1294)
    at java.util.TreeMap.put(TreeMap.java:538)
    at java.util.TreeSet.add(TreeSet.java:255)
    at Pair.main(Pair.java:24)

Kann mir das jemand erklären?
LG
 

Barista

Top Contributor
Java:
package ???;

import java.util.TreeSet;

public class Pair<X extends Comparable<X>, Y  extends Comparable<Y>>
implements Comparable<Pair<X,Y>>
{
    public X first;
    public Y second;

    public Pair() {

    }

    public Pair(X x, Y y) {
        first = x;
        second = y;
    }

    @Override
    public int compareTo(Pair<X,Y> p) {
        return first.compareTo(p.first);
    }


    public static void main(String[] args)
    {
        TreeSet<Pair<Integer,Integer>> ts = new TreeSet<Pair<Integer,Integer>>();
        Pair<Integer,Integer> p1 = new Pair<Integer,Integer>(1,2);
        ts.add(p1);
        System.out.println(ts.toString());
    }

}

Damit sind die Member des Pair und das Pair selbst Comparable.

Wobei der zweite Pair-Member gar nicht Comparable sein muss.
 

ocsme

Top Contributor
Danke.
Jetzt kann ich Element in den TreeSet einfügen.
Doch wie bekomme ich den TreeSet ausgegeben?
o_O

Verstehe das ganze nicht. Mein Versuch war das hier doch geht nicht! und mit einer for-each schleife bekomme ich es auch nicht hin :(

Java:
        Iterator<Pair> i = ss.iterator();
        while(i.hasNext()) {
            Pair p = i.next();
            System.out.println;
        }


ah so geht das ...
Java:
Iterator i = ss.iterator();
        while(i.hasNext()) {
            Pair p = (Pair) i.next();
            System.out.println(p.toString());
        }


Wie macht man das mit einer for-each schleife?
 

ocsme

Top Contributor
Warum ist das so?

Weil das TreeSet verlangt! Hatte ich auch vergessen!


Nun stehe ich vor zwei Problemen.
Erstens: Wie schreibt man das nun in einer for-each Schleife
Zweitens: soll noch eine Methode geschrieben werden und ich keine Idee habe wie man das hin bekommt.
Gesucht ist eine Methode die für eine gegebene Menge von abgeschlossenen Intervallen prüft ob es zwischen den Intervallen eine Lücke gibt (oder sets zwei benachbarte Intervalle einander überlappen) Signatur:
boolean existsGap(SortedSet<Pair<Float,Float>> inter { }
 
Zuletzt bearbeitet:

Robat

Top Contributor
Das *müssen* ist vielleicht auch zu hart gesagt. Man könnte auch der TreeMap einen Comparator übergeben
 

mihe7

Top Contributor
ah so geht das ...
Du willst vermutlich:
Java:
        Iterator<Pair<Integer,Integer>> i = ts.iterator();
        while(i.hasNext()) {
            Pair<Integer,Integer> p = i.next();
            System.out.println(p);
        }
oder eben:
Java:
for (Pair<Integer,Integer> p : ts) {
    System.out.println(p);
}
 
Zuletzt bearbeitet von einem Moderator:

ocsme

Top Contributor
Naja, schreib mal zwei Intervalle untereinander und überleg Dir, wann eine Lücke dazwischen ist.

Danke mihe7 wie immer :)
Werde das später mal probieren ob meine Idee klappt. Ich dachte nur es gäbe da ein Mathematischer Trick. Habe in meinen Bücher nach geschaut und auch gegooglet doch leider nichts gefunden.

Das Thema mit den Gernerics ist auch nicht meine Welt :( naja Übung macht den MEISTER :D (nur bei mir nicht :p)
Denn kann man auch dort alles mit Object machen und bekommt dann später die selben Fehler mit classCastException etc. wie bei den Arrays!

Java:
TreeNode<Integer> test = new TreeNode("1");
Durch die Fehlenden <> ist es vom Typ Object und ich kann munter ein String in mein Integer Container stecken :( Da fliegt mir der Kopf weg wer soll das noch verstehen :( :D

LG
 

mihe7

Top Contributor
Ich dachte nur es gäbe da ein Mathematischer Trick.
Nicht wirklich. Die Frage ist ganz einfach: wenn Du um 10:00 Uhr einen Parkschein für 1 Stunde ziehst, dann kannst Du bis 11:00 Uhr stehen bleiben (Intervall [10;11]). Um welche Uhrzeit kannst Du und um welche Zeit musst Du ein neues Ticket (=Intervall) kaufen, ohne dass Du (theoretisch) ohne gültiges Ticket parkst? Dann weißt Du, wann Du keine Lücken hast.

Durch die Fehlenden <> ist es vom Typ Object und ich kann munter ein String in mein Integer Container stecken
Die Zeile wird zu einem Compilerfehler führen.

Da fliegt mir der Kopf weg wer soll das noch verstehen :(:D
In der "Grundform" sind Generics doch relativ verständlich. In eine Kiste kann ich alles stecken, in eine Getränkekiste nur Flaschen. Die Funktionsweise ist aber immer die gleiche, die Kisten unterscheiden sich also nur vom Typ ihrer Elemente. Und der lässt sich mit einem Typparameter angeben. Kiste<Object> != Kiste<Flasche>
 

ocsme

Top Contributor
Nicht wirklich. Die Frage ist ganz einfach: wenn Du um 10:00 Uhr einen Parkschein für 1 Stunde ziehst, dann kannst Du bis 11:00 Uhr stehen bleiben (Intervall [10;11]). Um welche Uhrzeit kannst Du und um welche Zeit musst Du ein neues Ticket (=Intervall) kaufen, ohne dass Du (theoretisch) ohne gültiges Ticket parkst? Dann weißt Du, wann Du keine Lücken hast.

Also muss ich um 11 Uhr wieder hin für ein neues Ticket :) Danke somit muss bei 2 Intervallen A = [a,b] B = [a,b] A.b = B.a sein :)

Die Zeile wird zu einem Compilerfehler führen.
Natürlich wird die Zeile übersetzt es kommt sogar das Stirng Object bei der Abfrage zurück:
Java:
        TreeNode<Integer> ti = new TreeNode("8");
        System.out.println(ti.getClassData());
class java.lang.String

In der "Grundform" sind Generics doch relativ verständlich. In eine Kiste kann ich alles stecken, in eine Getränkekiste nur Flaschen. Die Funktionsweise ist aber immer die gleiche, die Kisten unterscheiden sich also nur vom Typ ihrer Elemente. Und der lässt sich mit einem Typparameter angeben. Kiste<Object> != Kiste<Flasche>

Du solltest ein Buch schreiben :) So wie du die Sachen erklärst versteht man es auch :)

LG
 

mihe7

Top Contributor
Also muss ich um 11 Uhr wieder hin für ein neues Ticket
Könntest Du Dir nicht auch um 10:45 Uhr ein neues Ticket für eine Stunde besorgen?

Natürlich wird die Zeile übersetzt
Mein Fehler.

Du solltest ein Buch schreiben :) So wie du die Sachen erklärst versteht man es auch :)
a) keine Zeit, ich bin ja mit dem Forum hier beschäftigt :p und
b) finde ich Erklärungen anderer - auch hier im Forum - wesentlich besser.
 

ocsme

Top Contributor
Könntest Du Dir nicht auch um 10:45 Uhr ein neues Ticket für eine Stunde besorgen?
haha doch das ist mir gerade auch bewusst geworden als ich versucht habe das ganze echt scheiße zu programmieren :(

Java:
static boolean existsGap(SortedSet<Pair<Integer,Integer>> inter) {
        Iterator<Pair<Integer,Integer>> i = inter.iterator();
        Integer tmp=null;
        while(i.hasNext()) {
            Pair<Integer,Integer> p = i.next();
            if(tmp!=null)
                System.out.println(tmp.compareTo(p.second));
            tmp = p.second;
        }
        return false;
    }

Ich komme einfach nicht drauf wie man das machen soll bei einer beliebigen Menge :(
Als Hinweis steht dort noch man sollte Integer.Max_Value nutzen.
 

ocsme

Top Contributor
Ich weiß ich bin ein nerviger Geselle :D

So hab es jetzt mal so gemacht:
Java:
static boolean existsGap(SortedSet<Pair<Integer,Integer>> inter) {
        Iterator<Pair<Integer,Integer>> i = inter.iterator();
        Integer tmp=null;
        while(i.hasNext()) {
            Pair<Integer,Integer> p = i.next();
            if(tmp!=null)
                if(tmp.compareTo(p.first) == -1)
                    return false;
                else if(tmp.compareTo(p.first) == 1) {
                     if(tmp.compareTo(p.second) > 0)
                        return false;
                }
            tmp = p.second;
        }
        return true;
    }

Ich glaube ich brauch nur abzufragen ob -1 bei der compareTo Methode raus kommt oder?
 
Zuletzt bearbeitet:

ocsme

Top Contributor
Weiß nicht ob es richtig ist aber habe heute auch keine Lust mehr :(
Hab es mal kurz mit Float versucht weil ich den Nachkommarteil testen wollte doch das übernimmt ja compareTo in Float für mich, wieder vergessen :D !!
Java:
    static boolean existsGap(SortedSet<Pair<Float,Float>> inter) {
        Iterator<Pair<Float,Float>> i = inter.iterator();
        Float tmp=null;
        while(i.hasNext()) {
            Pair<Float,Float> p = i.next();
            if(tmp!=null)
                if(tmp.compareTo(p.first) == -1)
                    return false;
            
            tmp = p.second;
        }
        return true;
    }
    
    public static void main(String[] args) {

        TreeSet<Pair<Float,Float>> ss = new TreeSet<Pair<Float,Float>>();
        Pair<Float,Float> p1 = new Pair<Float,Float>(-1f,11f);
        Pair<Float,Float> p2 = new Pair<Float,Float>(10.45f,11.45f);
        Pair<Float,Float> p3 = new Pair<Float,Float>(-45f,-.9f);

        ss.add(p1);
        ss.add(p2);
        ss.add(p3);

        System.out.println(existsGap(ss));
    }
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Wenn du weißt, welche Datentypen du hast, und du weißt, dass es Float oder Int's sind, dann kannst du einfach mit < und > vergleichen ;) Nur für den genetischen Teil musst du CompareTo benutzen, dann brauchst du Methode aber nicht doppelt für Float und Integer.



Wenn ich das richtig sehe, hängst du immer noch bei der Prüfung, ob es keine Lücken gibt?
Aktuell gibts bei dir noch Fälle, in denen das fehlschlägt, zB mit [(0,11), (9,10), (11,12)].
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
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
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
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
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
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
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
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
L Datentypen Deklarierte Felder einer Generic Klasse bestimmen Java Basics - Anfänger-Themen 7
F Type safety: A generic array of.. Fehler Java Basics - Anfänger-Themen 3
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
O Generic - Verstädnisproblem Java Basics - Anfänger-Themen 5
G instanceof in Generic Java Basics - Anfänger-Themen 7
P Variablen generic type variablen in object array Java Basics - Anfänger-Themen 1
M Generic Prüfungsvorbereitung Java Basics - Anfänger-Themen 4
G Generic und Listen Java Basics - Anfänger-Themen 8
J Generic - Autoboxing Java Basics - Anfänger-Themen 18
N Generic clonen => eclipse empfiehlt @SuppressWarnings("unchecked") Java Basics - Anfänger-Themen 2
S Generic Java Basics - Anfänger-Themen 9
P Java Generic Wildcard Java Basics - Anfänger-Themen 2
G Namen der Generic Klasse Java Basics - Anfänger-Themen 3
D generic extendet class Java Basics - Anfänger-Themen 10
M Generic's und Vererbung Java Basics - Anfänger-Themen 6
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
capgeti Datentypen Static generic return value von Subclass? Java Basics - Anfänger-Themen 9
C Generic Tutorial Java Basics - Anfänger-Themen 12
T Generic vom Generic: Zu sehr verschachtelt? Java Basics - Anfänger-Themen 6
V libssrckdtree-j Generic k-d tree Java library - weiss nicht wo des hin soll Java Basics - Anfänger-Themen 2
L Sinn hinter Generic? Java Basics - Anfänger-Themen 5
0 Was bedeutet dieser Generic-code? Java Basics - Anfänger-Themen 3
A Generic Problem Java Basics - Anfänger-Themen 16
S Generic Methode: syntax klemmt Java Basics - Anfänger-Themen 10
S Generic: Verständnisfrage Java Basics - Anfänger-Themen 2
S generic programmierung "ne:w T[X]" Java Basics - Anfänger-Themen 2
G generic interface problem Java Basics - Anfänger-Themen 12
Safado generic array creation Java Basics - Anfänger-Themen 2
G Frage zur Generic java ? Java Basics - Anfänger-Themen 9
G eine Frage zur Generic Java ? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben