Wie kann ich Sie stellen einen Bereich in Java?
Lassen Sie uns sagen, ein integer sein sollte, innerhalb der Reihe: [0...2147483647]
Möchte ich überprüfen, ob eine integer-variable fällt in diesen Bereich. Ich weiß, dass es erreicht werden kann durch eine einfache if-else-Anweisung, aber es ist ein effizienter Weg, um zu überprüfen, ob es innerhalb der Reichweite?
Ich würde lieber nicht tun:
if (foo >= 0 && foo <= 2147483647)
{
//do something
}
- Wenn Sie Fragen, für die Laufzeit-Effizienz (performance), ich habe Angst, dass deine
if
Aussage gewinnt. Ich Stimme, zwar, dass diese Beobachtung sollte nicht fahren Ihre Entscheidung. Für 99 % der Anwendungen, Wartungs-Effizienz wird wichtiger. - Ich würde sogar zu vereinfachen, um
if(foo >= 0) …
sein, denn es gibt keine Notwendigkeit, um zu überprüfen, ob eineint
ist<=Integer.MAX_VALUE
überhaupt. Aber ich bezweifle, dass der Fragesteller jemals Lesen Sie diese Kommentare, wie Sie nach fünf Jahren Abwesenheit zurück kommen, ruhig ist unwahrscheinlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Apache Commons Lang ist eine
Bereich
Klasse für das tun beliebiger Bereiche.Guave
Bereich
hat ähnliche API.Wenn Sie nur wollen, um zu überprüfen, ob eine Zahl passt in einen long-Wert oder einen int-Wert, könnten Sie versuchen, es über
BigDecimal
. Es gibt Methoden für dielongValueExact
undintValueExact
, die exceptions werfen, wenn der Wert zu groß für diese Genauigkeiten..contains(...)
umgesetzt wird? 😉 (Mit if/else sicher 🙂Könnten Sie eine Klasse erstellen, um dies darzustellen
Beispiel für die Nutzung:
low <= high
). Entweder muss der Abstand die Hälfte-öffnen[low, high)
oder sonst verwenden eineextent
statthigh
.Ich weiß, das ist eine ganz alte Frage, aber mit Java 8 Streams können Sie erhalten eine Reihe von
int
s so:Dann können Sie etwas wie das hier tun:
A
im besten Fall. Auf der anderen Seite, müssen Sie nur ein ist-VergleichA >= 0
hier.Wenn Sie die Prüfung gegen eine Menge von Intervallen, schlage ich vor, eine Intervall-Baum.
Könnten Sie
java.time.temporal.ValueRange
akzeptiertlong
und würde auch funktionieren mitint
:Haben Sie eine wenn-check egal, wie effizient Sie versuchen, um dies zu optimieren, nicht-so-intensiv-Berechnung 🙂 kannst Du abziehen, die Obere Schranke von der Anzahl und wenn es positiv ist, Sie wissen, Sie sind außer Reichweite. Sie können vielleicht führen einige Boolesche bit-Umschalt-Logik, um es herauszufinden, und Sie können sogar die Fermat ' sche theorem, wenn du willst (Scherz 🙂 Aber der Punkt ist, "warum" Sie brauchen, um dies zu optimieren, Vergleich? Was ist der Zweck?
Für eine Reihe von
Comparable
ich verwende die folgenden :(Dies ist ein etwas gekürzter version. Den vollständigen code finden Sie hier )