Home > Kredit ohne Schufa > Java Beschreibung

Java Beschreibung

Anmerkung: In Java-Programmen bestehen Bezeichnernamen oft aus zusammengesetzten Wörtern einer Beschreibung. Der Wortbaum ist daher nur eine grobe Beschreibung, die in der objektorientierten Programmierung als Klasse bezeichnet wird. Zur Beschreibung eines echten Baumes müssen wir zusätzliche Eigenschaften wie „hat der Baum Blätter oder Nadeln“ oder „wachsen Äpfel darauf“ definieren. Kompilieren und Starten des Java-Programms; Beispiel: Polymorphismus; Beispiel: Eingabe/Ausgabe von Text. Bemerkungen in Java /* mehrzeiliger Kommentar */.

Implementation of the compareTo() methods

Das ist das Handschrift eines Beitrags, der in der Rubrik „Effektives Java“ im JSPEKTRUM veröffentlicht wurde. Wir haben uns in dieser Serie von Artikeln bisher mit grundlegenden Funktionen auseinandergesetzt, die jede einzelne dieser Klassen in Java bietet. Wir haben uns ausführlich mit der Umsetzung der equal ()-Methode auseinandersetzt.

Wir wollen in dieser Nummer fortfahren und uns die Vergleichsmethode compareTo() ausprobieren. Da beide Verfahren Anweisungen über die Objektgleichheit geben, ist die Vergleichsmethode compareTo() stark mit der Gleichheitsmethode gleichzusetzen und sollte daher konsequent durchgesetzt werden. Was diese Konsistenzanforderung heißt, für was Sie compareTo() benötigen und was Sie beachten müssen, wenn Sie es richtig umsetzen wollen, erfahren Sie in dieser Nummer.

Wozu benötigen Sie compareTo()? Das Verfahren compareTo() ist sinnvoll, wenn ein Objekt eines Types in einem baumbasierten Behälter wie java.util. Tree-Map oder wenn Folgen solcher Gegenstände (mit Sortierungsmethoden wie Arrays. sort()) ausgelesen werden. Der Grund bei Behältern ist, dass baumbasierte Behälter ihre Gegenstände immer in einer sortierten Reihenfolge haben.

In früheren Beiträgen haben wir uns mit den Verfahren equals() und hashCode() auseinandersetzt. Die beiden Verfahren werden verwendet, wenn in einem hashbasierten Behälter zu verwaltende Gegenstände verwendet werden sollen.

Baumbasierte Behälter sind zwar anders aufgebaut als Hash-basierte Behälter, haben aber auch bestimmte Ansprüche an die zu verwaltenden Daten. Bei den hashbasierten Containern war die Anforderung: equals() und hashCode() müssen in einer konsistenten und korrekten Version verfügbar sein. Ähnlich verhält es sich bei den Containern auf Baumbasis.

Voraussetzung für die Ablage von Objekten in einem baumbasierten Objekt ist, dass für die entsprechenden Projekte ein Auftrag festgelegt wurde. Bei den im Behälter zu ladenden Objekten muss das Schnittstelle Vergleichbar implementiert sein und eine compareTo()-Methode zur Verfügung stehen. Ein Komparator kann Vergleiche von Objekten durchführen, die im Behälter abzulegen sind.

Der Komparator ist eine Instanzen einer Gruppe, die das Komparator-Interface implementieren und die equal () und compare() Methode zur VerfÃ?gung stellen.

Nachfolgend wird nur auf die Implementation der compareTo()-Methode eingegangen; all dies trifft sinngemäß auf die compare()-Methode eines korrespondierenden Komparators zu.

Dies ist bei compareTo() eindeutig anders. comparisonTo () ist nicht in Objekt, sondern in der Comparable-Schnittstelle festgelegt.

Wird das vergleichbare Interfacemodul von einer Klassen nicht realisiert, handelt es sich nicht um ein Missgeschick. Sie können weiterhin einen Vergleicher festlegen, der die Objektvergleichsfunktionalität in seiner compare()-Methode einführt. Existiert auch das nicht, können Sie solche Gegenstände nicht in baumbasierten Behältern abspeichern. Es ist auch nicht möglich, Reihenfolgen solcher Gegenstände zu ordnen.

Ein Vergleich von Objekten ohne compareTo() und ohne Komparator ist per Definition nicht möglich und kann daher weder sortiert noch in einem baumbasierten Behälter gespeichert werden. Dies kann aus der semantischen Sicht der Klassen vollständig richtig sein; nicht alle Gegenstände können per se sortiert werden. Auch kann es passieren, dass die Gegenstände sortiert werden können, aber diese Funktion wird in einer Anwendung nicht benötigt.

Im Gegensatz zu equals(), wo Sie sich definitiv Sorgen machen müssen, können Sie das Problem „compareTo()“ bei Notwendigkeit ausblenden. Bestimmte Beschränkungen gibt es ohne compareTo(), aber keine bösen Fehlers. Aber wenn Sie compareTo() einsetzen wollen, sollten Sie es richtig machen. Was sind baumbasierte Behälter und wozu benötigen sie die Vergleichsmethode compareTo()?

Baumbasierte Behälter sind eine Datenstruktur, die ihre Bestandteile in Form von Nodes speichert. Sie alle referenzieren sich, so dass der Behälter aus einem Netzwerk von untereinander vernetzten Teilnehmern zusammengesetzt ist. Dadurch wird eine Sortierfolge erzeugt; es gibt einen Navigations-Algorithmus, der alle Bestandteile des Containers vom kleinen über den nächsten bis zum großen Punkt anspricht.

Das bedeutet, dass auf alle Bestandteile eines baumbasierten Behälters in einer sortierten Anordnung zugegriffen werden kann. Nachfolgend eine kurze Darstellung der Hauptelemente; s. auch Bild 1, das den sinnvollen Ablauf eines baumbasierten Behälters aufzeigt.

Diese Sortierfolge ist eines der charakteristischen Eigenschaften eines baumbasierten Behälters. Falls Sie daran Interesse haben, dass die einzelnen Bestandteile einer Folge immer in einer sortierten Anordnung vorliegen, ist ein baumbasierter Behälter optimal. Er stellt automatisch sicher, dass neue Einträge immer an der „richtigen“ Position im Tree stehen, d.h. dort, wo das neue Eintragungselement entsprechend seinem Inhalt in der Sortierfolge hingehört.

Neben der Sortierfolge haben baumbasierte Behälter die Besonderheit, dass auf die Bestandteile des Behälters in der logarithmischen Zeit zugegriffen wird.

Dies ist in der Regel der Fall; auf Bäumen basierende Behälter gleichen ihre Binärbäume aus, wenn sie aus dem Lot sind. Im Vergleich zu einem Hash-basierten Behälter sind die Zugangszeiten sehr verlässlich.

Angenommen, wir wollen eine Klassen „vergleichbar“ machen, damit wir solche Klassen in baumbasierten Containern zwischenspeichern.

What exactly does an implementation of compareTo() have to do for the tree-based container to work ? The requirements for a comparator or a compareTo() method can be found in the JavaScript de la Java 2 Standart edition (J2SE) sous l’entrée Comparable. comparTo or Comparator.compare. Suggested languages are „Note: This group has a inherent order that is not the same.

Dies heißt: compareTo() muss eine der beiden möglichen Optionen angeben: Symmetrie: Wenn der Wert für den Wert für den Wert für den Wert für den Wert für den Wert von q kleiner als q ist, muss der Wert für den Wert für y grösser als dieser sein. Consistency to equals(): Es wird vorgeschlagen, dass gleiche Gegenstände gemäß equals() auch gemäß compareTo() gleich sein sollten und vice versa. Sie sehen hier klar die engen Beziehungen zwischen equals() und compareTo().

Die Gleichberechtigung von equals() und compareTo() ist nicht erforderlich, wird aber unbedingt angeraten. Beispiel für eine Bestellbeziehung, die nicht mit equals() übereinstimmt, ist die Vergleichsmethode compareToIgnoreCase() der String-Klasse. Der Rückgabewert dieser Funktion gilt nur für Zeichenketten, bei denen die Groß-/Kleinschreibung beachtet wird.

Als weiteres Beispiel für einen mit equal () inkonsistenten Abgleich wäre folgendes zu nennen:

Ein Klassenname, bestehend aus Vor- und Nachnamen. In diesem Fall wären die beiden Brüder in Bezug auf equals() unterschiedlich, in Bezug auf compareTo() aber gleich.

Aus Konsistenzgründen ist es notwendig, dass die Implementation von compareTo() exakt die Informationen enthält, die auch zum Resultat von equals() beitragen, und vice versa. Falls eine uneinheitliche Implementation des Vergleiches durch Classes vorliegt, die zu gleich() ist, sollten Sie dies in der Beschreibung der jeweiligen Methode nachlesen. In der Beschreibung der Java-Docs für die jeweilige Klassenbezeichnung empfiehlt das JavaScript eine Phrase: „Hinweis: Diese hat eine natürliche Ordnung, die nicht mit Gleichen übereinstimmt.

Vergleichen mit() und Comparator.compare()). Was ist bei der Einführung von compareTo() zu berücksichtigen? Tatsächlich muss man fast die gleiche Aufmerksamkeit widmen wie bei der Umsetzung von equals(). Es gibt nicht viel über die Unterschrift von compareTo() zu berichten. Bei Objekten, die Sie in einem BaumSet oder einer BaumKarte speichern wollen, muss das Comparable-Interface realisiert sein.

Alternativ zur Comparable-Schnittstelle steht der Komparator zur Verfügung.

Es wird die neue Version der java.util. Ein Beispiel ist das Datum.

Schauen wir uns eine Unterklasse namens Datum an: privater Stringname; falls (super.

Aus diesem Grund wird die oben dargestellte Umsetzung nicht empfohlen. Bei den Auflösungsregeln in Java ist die Fehlernachricht des Compilers aufgrund des mehrdeutigen Methodenaufrufes nicht verwunderlich. Die Java-Kompilierer müssen die korrekte Vergleichsversion von compareTo() ermitteln, um a. compareTo(b) aufzurufen. Möglich sind alle compareTo() Verfahren der Class NameDate und alle verfügbaren compareTo() Verfahren aller Oberklassen von BenanntenDat.

In der Sprachenbeschreibung (siehe /GOS /) sind die exakten Spielregeln für den Methodenaufruf angegeben und schwierig zu erlernen. Beim zweiten Bewerber Datum. compareTo(Object) muss die gleiche Umrechnung für das jeweilige Objekt vorgenommen werden und der Bewerber ist ebenfalls in einem anderen Umfang festgelegt, und zwar in der Oberklasse Datum.

Da in Java mehrdeutige Verfahrensaufrufe so rasch erfolgen, vermeiden Sie in der Regel eine Überladung (mehrere Varianten der gleichen Methode in derselben Klasse) und eine Überlagerung (Neudefinition von Verfahren in abgeleitete Klassen) in Hierarchien.

Zur Vermeidung von Mehrdeutigkeiten wird nur eine compareTo() Methodik pro Class eingesetzt. Aber was ist, wenn Sie von einer Oberklasse wie Datum mit ihren überlasteten Version von compareTo() abgeleitet werden wollen oder müssen? Es gibt nur die Option, alle Version von compareTo() neu zu bestimmen.

Generell erachten wir die Nutzung mehrerer überlasteter Varianten von compareTo(), wie sie im Rahmen des japanischen JDKs zu finden sind, als unnachahmlich. Es hat keinen signifikanten Nutzen und bewirkt eine inflationäre Zunahme überlasteter Varianten in Hierarchien. Der eigentliche Ablauf der compareTo() ist ähnlich wie bei der Umsetzung von equals(). Wie bei der Umsetzung von equals() wird zunächst geprüft, ob die beiden zu untersuchenden Gegenstände gleich sind.

Gleiche Gegenstände sind besonders gleich, d.h. compareTo() muss 0 zurückliefern, und Sie können sich jeden weiteren Arbeitsaufwand ersparen. zurück 0; …. Das Überprüfen, ob andere eine Nullreferenz ist, entfällt normalerweise bei der Implementation von compareTo(). Die Umsetzung von equals() ist anders.

comparisonTo () dagegen ist auch für Nullreferenzen gleich und löst in beiden Fall eine Nicht-PointerException aus. Die Vergleichs-Schnittstelle erfordert, dass man compareTo() mit der Unterschrift öffentlich macht in compareTo(Object other) implémentiert. Damit können andere Personen beliebige Objekttypen referenzieren. Wir haben diesen Vergleichstest bei equals() eingehend erörtert () (siehe /KRE /).

Dies ist eine Antwort, die sich klar von dem Resultat unterscheidet, das equals() in der selben Lage ausgibt. Der Rückgabewert der Gleichheitsmethode equals() ist falsch, während compareTo() in der selben Lage eine ungeprüfte Ausnahme auslöst.

Es können beliebige Gegenstände in einem Hash-basierten Java-Container gespeichert werden. Dies bedeutet, dass es auch unterschiedliche Arten von Gegenständen in einem Behälter geben kann. Derartige heterogene Elementfolgen können mit baumbasierten Java-Containern nicht erreicht werden. Dies ist kein Hindernis und der „Fremde“ wird eingesetzt und kann später wieder im Behälter wiedergefunden werden.

Die Verhaltensweisen von Tree- und Hash-Set sind völlig unterschiedlich und dieser Effekt resultiert als Nebenwirkung der von compareTo() geworfenen KlasseCastException.

Warum ist es also so, dass Sie eine Ausnahme in compareTo() auslösen, anstatt eine wohlwollende Reaktion zu geben? Würde man probieren zu sagen: „Alle Fremdkörper sind kleiner als meine selbst. Daraus resultieren „Inseln der Vergleichbarkeit“, d.h. Objektmengen, die mittels compareTo() untereinander vergleichbar sind.

Es können nur Vergleichsobjekte zusammen in einem Baumcontainer aufbewahrt werden. Bei der Durchführung des oben beschriebenen Vergleichstests per getClass() wird eine “ Island “ aus allen Objekten des gleichen Typs gebildet. Wie auch bei equals() können Sie prüfen, ob Sie die Kompatibilität auf Unter- und Oberklassen erweitern wollen. Derartige Implementationen von compareTo() finden Sie im JavaScript-Programm.

Ein Beispiel haben wir bereits erlebt, und zwar in der java_Utility. Datum: …. Sie schlägt mit der angeforderten KlasseCastException fehl, wenn das Parameter kein Datum und kein von Datum abgeleiteter Datentyp ist.

Das bedeutet, dass alle gleichartigen oder subtypischen Gegenstände als gleichwertig betrachtet werden. Dieser Typ der Implementation ist ähnlich wie die oft für equals() verwendete, aber problematische Methode der Vergleichbarkeitsprüfung von Operatoren.

Genauso verhält es sich mit compareTo(), wenn der Vergleichstest per downncast durchgeführt wird. Die Umsetzung schlägt fehl, weil sie gegen die Forderung (4) aus dem Vergleichervertrag verstößt:

comparisonTo (y) aufgerufen die Klasse Datum. comparisonTo (Datum), die die Oberklassenanteile der beiden Elemente vergleicht. comparisonTo (z) erneut die Funktion Datum. comparisonTo (Datum) und equal wird zurückgegeben.

Aufgerufen wird die Methodik BenanntesDatum. compareTo(NamedDate), die den unterklassenspezifischen Teil, also den Zeichenkette, enthält und dann nicht mehr die Equalitä…. Genauso wie equals() kann der Abgleich von Unter- und Oberklassenobjekten nicht richtig implementiert werden, wenn die Unterklassen eigene Eingabefelder einfügen.

Bei den Implementationen von compareTo() in der java_usw. Datum sind nicht verkehrt, aber eine Unterklasse von Datum, die weitere nicht-transiente, nicht-statische Datenfelder hat, kann keine richtige Implementation von compareTo() bereitstellen. Daher sollten die Datum. compareTo() Methode als endgültig erachtet werden. Bei eigenen Gattungen und Hierarchien, wie bei equals(), empfiehlt sich der Vergleichstest mit getClass().

Dies hat nur die Beschränkung zur Folge, dass nur gleichartige Gegenstände in einem baumbasierten Behälter abzulegen sind. Angenommen, wir haben Datum und Namensdatum mit getClass() anstelle des Downcasts umgesetzt und wollten trotzdem ein Baumset mit Datum und Namensdatum-Objekten erstellen. Danach können Sie einen besonderen Datumskomparator erstellen, der den Abgleich von Datum s- und NamedDate-Objekten in seiner compare()-Methode erlaubt und immer den Datumsteil der Datenvergleiche durchführt.

Falls Sie das BaumSet mit diesem Datumskomparator versorgen, benutzt der Behälter die compare()-Methode des Datumskomparators anstelle der compareTo()-Methoden der Einzelelemente. Auf diese Weise können Sie auf einfache Weise den gesuchten Heterogencontainer erstellen und alle darin enthaltenen Bestandteile werden hinsichtlich der Sortierbarkeit wie Datumsobjekte betrachtet. Das Verfahren getClass() ist in compareTo() viel weniger restriktiv als equals(), da die baumbasierten Behälter im Vergleich zu den hashbasierten Behältern sehr biegsam sind.

Es gibt kein Gegenstück zum Komparator, d.h. eine Variante zu hashCode() und equals(), für die hashbasierten Java-Container. Wie Sie dies tun, ist abhängig von der Bedeutung der Klassen. vergleicheTo() mit der Oberklasse. Die erste oder letzte Variante ist abhängig von der Bedeutung der Klassen und der gewählten Sortierung.

Im Beispiel einer Vor- und Nachnamenklasse könnte eine Gattung hergeleitet werden, die auch das Datum der Geburt hat. comparisonTo () aufgerufen wird, legt der Dateiname die Sortierung fest, und das Datum der Geburt kommt nur ins Spiel, wenn es sich um den gleichen Dateinamen handelt. comparisonTo () später, und zwar nur, wenn die Daten der Geburt gleich sind.

Im Gegensatz zu equals() delegieren Sie also nicht in der Regel zuerst an die Oberklasse. Es müssen alle auch für equals() berücksichtigten Datenfelder wegen ihrer Übereinstimmung mit equals() in den Abgleich miteinbezogen werden. Transiente und primitive Feldtypen, Referenzfelder, Felder, die Verweise auf speziell in equals() behandelte Gegenstände sind.

Transientenfelder werden wie bei equals() nicht berücksichtigt. Für referenzierte Eingabefelder wird in der Regel die Vergleichsmethode compareTo() der jeweiligen Klassen aufgerufen. Für solche Feldtypen, die auf solche Arten verweisen, die das vergleichbare Interfaces nicht implementiert haben, müssen Sie, falls vorhanden, einen passenden Komparator verwenden. Falls dies nicht existiert und das entsprechende Eingabefeld zur Umsetzung von equals() beiträgt, können Sie mit equals() keine Übereinstimmung mehr erwirken.

Felder, die Verweise auf ein Objekt sind, das in equals() speziell behandelt wurde, müssen in der Implementation von compareTo() speziell behandelt werden, da sie mit equals() konsistent sind. Das Gleiche gilt für die Implementation von compareTo(). Dies ist auch deshalb sinnvoll, weil die Zeichenkette nicht vergleichbar ist, aber die Zeichenkette.

Wir haben uns in diesem Beitrag mit der vergleichenden Funktion compareTo() beschäftigt, d. h. mit dem Ordnen von Gegenständen und dem Ablegen von Gegenständen in baumbasierten Behältern. Es wurden die Voraussetzungen für die compareTo()-Methode, den so genannten Comparator-Vertrag, untersucht und erörtert, wie man compareTo() korrekt implementiert. Das Hauptproblem ist die Übereinstimmung mit equals(), die zwar empfehlenswert, aber nicht obligatorisch ist.

Durch die Konsistenzanforderung entsteht eine enge Beziehung zur Umsetzung der gleichwertigen Methoden einer Klassen. Darüber hinaus haben wir festgestellt, dass baum- und hashbasierte Behälter trotz gängiger Schnittstellen semantisch verschieden sind, da in hashbasierten Behältern gutartige Vorgänge zu Ausnahmen in baumbasierten Behältern geführt haben. /1/Diese equals()-Methode im Schnittstellenvergleicher hat nichts mit dem Vergleichen der vom Vergleicher mit compare() verglichenen Objekten zu tun.

Komparator. equals() stellt Komparatoren einander gegenüber; Komparator. Die Funktion compare() gleicht zwei verschiedene Objekttypen ab. Vergleicher-Beispiel: Rückgabe ((String)o1).

Leave a Reply

Your email address will not be published.

Ja, auch diese Webseite verwendet Cookies. Hier erfahrt ihr alles zum Datenschutz