Servus zusammen, ich habe zwei klassen und arbeite mit dem Comparable interface und dem Comparator und ich muss drei WErte vergleichen nach "größen so wie ich das verstanden habe". Doch verstehe ich nicht ganz wie ich das umsetzen soll und würde mich über ein paar Denkanstöße sehr freuen!
1. Klasse
Java:
publicclassTripel<U,V,W>implementsComparable<Tripel<U,V,W>>{/**
* instance variables
*/U u;V v;W w;/**
* from comparable interface
*/@OverridepublicintcompareTo(Tripel<U,V,W> o){return0;}/**
* Constructor
*
* @param first parameter
* @param second parameter
* @param third parameter
*/publicTripel(U first,V second,W third){this.u = first;this.v = second;this.w = third;}}
2.Klasse
Java:
importjava.util.Comparator;publicclassTripelComparator<U,V,W>implementsComparator<Tripel<U,V,W>>{/**
* compare from comparator and can equal objects from Tripel
*/@Overridepublicintcompare(Tripel<U,V,W> o1,Tripel<U,V,W> o2){return0;}}
Ich soll u aufsteigend dann v aufsteigend dann w aufsteigend vergleichen. Denke mal das beduetet der größe nach? Mir fehlt irgendwie das wissen um das richtig mit den generics anzuwenden wie ich die Objekte logisch vergleiche. Im Netz konnte ich bisher nichts finden und Bücher haben mir leider auch nicht richtig geholfen.
Ist die Klasse Tripel so vorgegeben? Sollst Du die Klasse anpassen? Wenn ja, darfst Du die Deklaration ändern? Ich frage, weil das in der Form nur funktioniert, wenn Du den Typ von U, V und W überprüfst (U, V und W sind beliebige Typparameter. Beliebige Typen definieren aber keine Ordnung).
Wie Flown schon schreibt, muss jeder der drei Typen comparable sein oder du implementierst für jeden einen Comparator. In dem Comparator, den du schon hast, gehst du dann wie folgt vor:
Vergleiche die U-Werte. Sind die nicht gleich -> entsprechend -1 oder 1 zurückliefern.
Vergleiche die V-Werte. Sind die nicht gleiche -> entsprechend -1 oder 1 zurückliefern.
Das gleiche mit W.
Diese drei Werte müssen sicher den gleichen Typ haben.
Du benötigst also nur einen Typ-Parameter.
Sieh Dir das mal bei Comparable an:
Java:
publicclassXextendsComparable<X>{}
Abgesehen davon ist die Aufgabenstellung sehr verworren.
Sicher eine Hausaufgabe, der Sinn einer Hausaufgabe ist, sich mit dem Problem zu befassen, nicht die Aufgabe von Anderen lösen zu lassen.
In nahezu jeder Implementierung ist das anders gelöst. Tupel (in Varianten von 1-X Elementen) ist meist 'beliebige Typen, feste Länge', und Listen 'gleiche Typen, beliebige Länge' (gleiche Typen natürlich nur in sprachen mit statischen Typen).
zB in Haskell, Typescript, Java mit zB javatuples, C#, Python, ...
Wibei beides recht blöde Krücken sind, die mir nicht gefallen. Man hat 3 Werte, die ja irgend etwas ausdrücken und die irgendwie zusammen gehören.
Ich saube mir mal etwas aus den Fingern: Autos, da speichert man ganz viele Daten... und nun gibt es da etwas wie getBeschleunigungswerte oder so. Und da kommen halt 3 Zahlen zurück: PS, Sekunden von 0 auf 100 und Sekunden von 100 auf 120.
Bei einem Tripel hat man dann bei der Abfrage so Dinge wie getFirst, getSecond, getThird oder was man da als universelle Getter nehmen möchte.
Da würde ich auf die Typprüfung lieber verzichten und Konstanten nutzen so dass ich da dann sowas wie ....[RESULT_INDEX_HORSEPOWER] und so hätte ... die fehlende Typkontrolle des Compilers muss natürlich entsprechend mit Unit Tests abgedeckt sein.... (nicht schön, klar!)
Aber das ist auch eine absolute Krücke. Wieso nicht einfach eine kleine Klasse dafür...oder Records von Java14 bieten sich an.
Dann habe ich die volle Typisierung + lesbaren Code.
Pair und Co haben zumindest in meinen Augen keinen wirklich großen Nutzen. (Die Aufgabe hier ist ja wohl auch mehr eine reine Übung)
z.B. Ein Wahrscheinlichkeitsraum ist ein Tripel aus ( Ergebnismenge, Algebra, Wahrscheinlichkeitsmaß )
Allerdings ist bei unterschiedlichen Typen ein Größenvergleich im Allgemeinen nicht sinnvoll. Daher denken ich, dass in dem Beispiel der selbe Typ gemeint ist.
Ja, in den meisten Fällen sind Domänen-spezifische Klassen passender als generische Tupel - für viele Fälle, in denen Tupel sinnvoll sind, gibts ja jetzt auch Records
Das ist mit Tripel<String, Integer, Double> problemlos möglich.
Man kann logischerweise nur zwei gleichen Typen vergleichen, aber der zu vergleichende Typ ist in diesem FallTripel<X, Y, Z>. X, Y und Z können aber unterschiedlich sein.