[Java] Bereichsprüfung, für die kein compareTo erforderlich ist

Wie implementieren Sie die Bereichsprüfung?

Das Überprüfen des Bereichs von Zahlen und Zeichen wird häufig mit einer Kombination von "obj.compareTo (value)" geschrieben. Aber ich kann mich einfach nicht an das Muster des Rückgabewerts von compareTo erinnern ... Ich erinnere mich nur daran, dass das Match "0" ist. Ich führe es jedes Mal aus, um zu überprüfen, welches kleiner / größer ist, > 0 oder <0 ... Es gab jedoch eine Möglichkeit, das Schreiben einer Bereichsprüfung von "über dem Minimalwert und unter dem Maximalwert" unter Verwendung der compareTo-Methode und der Operatoren für Gleichheit / Ungleichheit zu vermeiden.

Immerhin ist Apache Commons ausgezeichnet

Die Klasse "org.apache.commons.lang3.Range" (die es schon seit einiger Zeit gibt, aber nicht kennt) war der Retter von Ponkotsu SE ... das kann ich mir vorstellen. Wenn Sie mit "Java Range Check" googeln, steht die Implementierung durch Gleichheits- und Ungleichheitsoperatoren und compareTo ganz oben in den Suchergebnissen, sodass Sie sie nur dann leicht erreichen können, wenn Sie ein wenig "Commons" oder Schlüsselwörter entwickeln, oder? ..

Beispielcode

int num0 = 0;
int num1 = 1;
int num2 = 2;

//Erstellen Sie ein Bereichsobjekt
Range rng = Range.between(num0, num2);

System.out.println("Innerhalb des Bereichs prüfen(" + num1 + ") = " + rng.contains(num1));
System.out.println("Innerhalb des Bereichs prüfen(" + -1 + ") = " + rng.contains(-1));

//Mit Range können Sie mehr als nur die Reichweite überprüfen.
System.out.println("Mindestreichweite= " + rng.getMinimum() + ", Maximale Reichweite= " + rng.getMaximum());
System.out.println("Überprüfen Sie, ob der Bereich nach dem Argument liegt(" + -1 + ") = " + rng.isAfter(-1));
System.out.println("Überprüfen Sie, ob der Bereich nach dem Argument liegt(" + num0 + ") = " + rng.isAfter(num0));

//Es kann eine Methodenkette sein, ohne sie in einer Variablen zu speichern
System.out.println("Innerhalb des Bereichs prüfen(" + num1 + ") = " + Range.between(num0, num2).contains(num1));

Ausführungsergebnis

Innerhalb des Bereichs prüfen(1) = true
Innerhalb des Bereichs prüfen(-1) = false
Mindestreichweite=0, maximale Reichweite= 2
Überprüfen Sie, ob der Bereich nach dem Argument liegt(-1) = true
Überprüfen Sie, ob der Bereich nach dem Argument liegt(0) = false
Innerhalb des Bereichs prüfen(1) = true

Zusätzlich zum obigen Beispiel werden verschiedene Methoden wie "isBefore" und "elementCompareTo" implementiert, die einen Rückgabewert wie "compareTo" zurückgeben. Übrigens, wenn die minimalen und maximalen Werte von dazwischen nicht übereinstimmen, tritt ein Kompilierungsfehler auf, und wenn einer von ihnen null ist, tritt eine IllegalArgumentException auf. Unabhängig von der Reihenfolge der zwischen und übergebenen Minimal- und Maximalwerte wird der Bereich auch mit "zwischen (Maximalwert, Minimalwert)" korrekt eingestellt. (Die Werte von "getMaximum" und "getMinimum" fallen nicht zusammen.) Wenn der Typ des Bereichs nicht mit dem Typ des enthaltenen Arguments übereinstimmt, tritt eine ClassCastException auf.

Vorteile von Generika

Die Range-Klasse ist großartig, nur weil es eine Pause von compareTo ist, aber das ist nicht die einzige großartige Sache. Das obige Beispiel war ein int-Typ eines Grundelements (keine Konvertierung in eine Ganzzahl erforderlich), aber Sie können beispielsweise einen Zeichenfolgentyp sowie einen Datums- oder Zeittyp übergeben! Reichweite Ich liebe dich wirklich.

//Datumstyp(LocalDate)Stichprobe
LocalDate ld0 = LocalDate.now().minusDays(1);
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.now().plusDays(1);

Range rng = Range.between(ld0, ld2);
System.out.println(rng.contains(ld0)); // true
System.out.println(rng.contains(ld1)); // true
System.out.println(rng.contains(ld2)); // true
System.out.println(rng.contains(ld2.plusDays(1))); // false
System.out.println(rng.isAfter(ld0.minusDays(1))); // true
System.out.println(rng.contains(null)); // false

Ich wollte es früher wissen ... es ist das Höchste ...

Sie können auch ein Comparator-Klassenobjekt an dazwischen übergeben, um Ihre eigenen Objekte zu vergleichen. Wirklich die Besten der Besten. Ich habe das Gefühl, dass sich der Zustand des Ponkotsu ein wenig verbessert.

Ich glaube nicht, dass es so viele Ponkotsu SEs gibt, die sich nicht an den Rückgabewert von compareTo erinnern können, aber ich denke, es ist einfacher zu verstehen, wenn man die Range-Klasse verwendet. Mit enthält benötigen Sie nicht einmal einen logischen Operator. Daher möchte ich, dass Sie die Range-Klasse in Zukunft für die Implementierung der Bereichsprüfung verwenden.

Recommended Posts

[Java] Bereichsprüfung, für die kein compareTo erforderlich ist
[Java] compareTo
Der Java Integer-Vergleich (==) funktioniert nicht richtig
Eclipse wird nach der Installation von Java 11 nicht gestartet
Java-Versionsprüfung
Java-Überprüfungsprozess