Wie überprüfe ich, ob eine Ganzzahl in einem bestimmten Bereich liegt?


78

Ich hoffe auf etwas eleganteres als

if (i>0 && i<100) 

8
Was ist los mit dem, was du hast?
GreenMatt

3
Die naheliegende Lösung besteht darin, eine zu haben, class RangeChecker<Integer>und ich bin sicher, dass Sie die Details von dort aus eingeben können.
CorsiKa

7
Vielleicht hoffte OP auf eine semantische Möglichkeit ähnlich ZWISCHEN inSELECT * FROM aTable WHERE aDate BETWEEN lower AND upper
Simen S

16
Genau wie von Interesse erlaubt Python die Syntax 0 < i < 100für solche Tests.
Greg Hewgill

2
Die Apache Commons-Klasse org.apache.commons.lang.math.IntRange passt möglicherweise zu Ihnen.
Abhishek

Antworten:


198

Sie könnten Abstand hinzufügen;)

if (i > 0 && i < 100) 

9
Verkrampfe meinen Stil nicht! Nein, ich platziere es normalerweise so.
Herpderp

11
Da wir normalerweise so etwas wie "0 <i <100" schreiben würden, ist es schön, dem so weit wie möglich zu folgen, um den Code ein bisschen leichter lesbar zu machen : 0 < i && i < 100. Es ist ein bisschen komisch, die Konstante links zu haben 0 < i, aber ich denke, es lohnt sich, den Gesamtausdruck zu haben, der am ehesten aussieht 0 < ... < 100.
Joshua Taylor


32

Ich denke

if (0 < i && i < 100) 

ist eleganter. Sieht aus wie eine mathematische Gleichung.

Wenn Sie etwas Besonderes suchen, können Sie Folgendes ausprobieren:

Math.max(0, i) == Math.min(i, 100)

Zumindest verwendet es Bibliothek.


5
Beachten Sie, dass die 2. Lösung inklusive ist, die 1. nicht.
holmis83

Sollte es nicht sein Math.min(i, 99)? Denn wenn ich eingebe 100, wird es immer noch true zurückgeben. Ich denke, Math.max(0, i) == Math.min(i, 100)funktioniert für 0 < i <= 100
Irshu

9

Ich denke, es ist schon eine elegante Art, die Reichweite zu vergleichen. Dieser Ansatz führt jedoch dazu, dass Sie zusätzliche Komponententests schreiben, um alle &&Fälle zu erfüllen .

Sie können also einen der folgenden Ansätze verwenden, um das Schreiben zusätzlicher Komponententests zu vermeiden.

Verwenden von Java 8-Streams:

if(IntStream.rangeClosed(0,100).boxed().collect(Collectors.toList()).contains(i))

Verwenden der Matheklasse:

if(Math.max(0, i) == Math.min(i, 100))

Persönlich empfehle ich den zweiten Ansatz, da dadurch kein Array mit der Größe erstellt wird, die dem Bereich entspricht, den Sie überprüfen möchten.


9
ValueRange range = java.time.temporal.ValueRange.of(minValue, maxValue);
range.isValidIntValue(x);

es gibt true zurück, wenn minValue <= x <= MaxValue - dh innerhalb des Bereichs

es gibt false zurück, wenn x <minValue oder x> maxValue - dh außerhalb des Bereichs

Verwenden Sie mit wenn Bedingung wie unten gezeigt:

int value = 10;
if(ValueRange.of(0, 100).isValidIntValue(value)) {
    System.out.println("Value is with in the Range.");
} else {
    System.out.println("Value is out of the Range.");
}

Unter Programm wird geprüft, ob einer der übergebenen ganzzahligen Werte in der hasTeen-Methode im Bereich von 13 (einschließlich) bis 19 (einschließlich) liegt.


import java.time.temporal.ValueRange;    
public class TeenNumberChecker {

    public static void main(String[] args) {
        System.out.println(hasTeen(9, 99, 19));
        System.out.println(hasTeen(23, 15, 42));
        System.out.println(hasTeen(22, 23, 34));

    }

    public static boolean hasTeen(int firstNumber, int secondNumber, int thirdNumber) {

        ValueRange range = ValueRange.of(13, 19);
        System.out.println("*********Int validation Start ***********");
        System.out.println(range.isIntValue());
        System.out.println(range.isValidIntValue(firstNumber));
        System.out.println(range.isValidIntValue(secondNumber));
        System.out.println(range.isValidIntValue(thirdNumber));
        System.out.println(range.isValidValue(thirdNumber));
        System.out.println("**********Int validation End**************");

        if (range.isValidIntValue(firstNumber) || range.isValidIntValue(secondNumber) || range.isValidIntValue(thirdNumber)) {
            return true;
        } else
            return false;
    }
}

******AUSGABE******

wahr, da 19 Teil der Reichweite ist

wahr, da 15 Teil der Reichweite ist

false, da alle drei Werte außerhalb des Bereichs liegen


Schön, ich habe es in wenn Zustand wie -if(ValueRange.of(90, 100).isValidIntValue(91)) { "Value is in range." }
Yash

7

Ich verstehe nicht, dass das nicht elegant ist, aber wenn Sie den Ausdruck oft wiederholen, ist es eine gute Idee, ihn in eine Methode einzufügen, z

class MathUtil
{
   public static boolean betweenExclusive(int x, int min, int max)
   {
       return x>min && x<max;    
   }
}

Dies gilt insbesondere dann, wenn Sie exklusive und inklusive Vergleiche mischen. Der Methodenname kann dazu beitragen, Tippfehler zu vermeiden, z. B. die Verwendung von <when ​​<= hätte verwendet werden sollen. Die Methode kann auch sicherstellen, dass min <max etc ..


9
Es ist eine gute Idee, bis jemand boolean accepted = MathUtil.betweenExclusive(min,max,x);die Bestellung eingibt und mischt. :(
corsiKa

Ich kenne! Autsch. In diesen Fällen kann ein Range-Objekt hilfreich sein.
Mdma

Mein RangeChecker-Objekt war eigentlich ein Witz, aber im Nachhinein ist es keine so schlechte Lösung (auch wenn es übertrieben ist)
corsiKa

Es wäre besser, wenn es eine Methode wäre, die direkt in der IntegerKlasse definiert wird . Es gibt keine Verwirrung, wenn Sie dies tun; myNum.isBetween(min, max)
Burak

Einfaches Beispiel: Ich habe eine Liste von Personen mit ihrem Alter und möchte überprüfen, ob jeder von ihnen alt, mittleren Alters, Kind oder Kleinkind ist. Ich kann Altersbereiche benannt haben, und dann ist mein Code gut lesbar. Oder ich kann viele> und <haben und mein Code ist Kauderwelsch.
Mikhail Batcer

5

Wenn Sie etwas Originelleres suchen als

if (i > 0 && i < 100)

Sie können dies versuchen

import static java.lang.Integer.compare;
...
if(compare(i, 0) > compare(i, 100))

4

Dieser Typ hat eine schöne Range- Klasse gemacht.

Seine Verwendung ergibt jedoch keinen netten Code, da es sich um eine generische Klasse handelt. Sie müssten etwas eingeben wie:

if (new Range<Integer>(0, 100).contains(i))

oder (etwas besser, wenn Sie zuerst implementieren):

class IntRange extends Range<Integer>
....
if (new IntRange(0,100).contains(i))

Semantisch sind beide meiner Meinung nach besser als das, was Java standardmäßig bietet, aber der Speicheraufwand, die Leistungsverschlechterung und insgesamt mehr Eingabe sind es wert. Persönlich mag ich mdmas Ansatz besser.


Seite für URL der Bereichsklasse nicht gefunden.
Shridutt Kothari

3
if ( 0 < i && i < 100)  

if ( 'a' <= c && c <= 'z' )

1
Abgesehen von dem inkonsistenten Abstand im ersten Beispiel perfekt!
Jakub Hampl

1
Schade, dass die 6-Zeichen-Regel Korrekturen am Abstand verhindert.
Martin

1
Ein besserer Char Check istif (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
Octavia Togami

1
@ ıɯɐƃoʇǝızuǝʞ Noch besser:Character.isLetter(c)
Roland Illig


1

So überprüfen Sie, ob eine Ganzzahl in einem Bereich liegt. Größer als die Untergrenze, kleiner als die Obergrenze. Der Versuch, mit Subtraktion klug zu sein, wird wahrscheinlich nicht das tun, was Sie wollen.


Der Versuch, mit Subtraktion klug umzugehen, kann zu einem ganzzahligen Über- oder Unterlauf führen und zu einem falschen Ergebnis führen.
CorsiKa

1

Versuchen:

if (i>0 && i<100) {} 

es wird zumindest funktionieren;)


1

Verwenden Sie diesen Code:

if (lowerBound <= val && val < upperBound)
or
if (lowerBound <= val && val <= upperBound)

0

Wenn Sie sicher sind, dass Zahlen in der 2er-Komplementform gespeichert sind:

return  ((x-low) <= (high-low));

Eine allgemeinere und sicherere Lösung wäre:

return ((x-high)*(x-low) <= 0);

0

Wenn Sie Spring-Daten verwenden, können Sie auch das Range-Objekt von Spring verwenden.

range = new org.springframework.data.domain.Range (3, 8); range.contains (5) gibt true zurück.


0
 Range<Long> timeRange = Range.create(model.getFrom(), model.getTo());
    if(timeRange.contains(systemtime)){
        Toast.makeText(context, "green!!", Toast.LENGTH_SHORT).show();
    }

0

Googles Java Library Guava implementiert auch Range :

import com.google.common.collect.Range;

Range<Integer> open = Range.open(1, 5);
System.out.println(open.contains(1)); // false
System.out.println(open.contains(3)); // true
System.out.println(open.contains(5)); // false

Range<Integer> closed = Range.closed(1, 5);
System.out.println(closed.contains(1)); // true
System.out.println(closed.contains(3)); // true
System.out.println(closed.contains(5)); // true

Range<Integer> openClosed = Range.openClosed(1, 5);
System.out.println(openClosed.contains(1)); // false
System.out.println(openClosed.contains(3)); // true
System.out.println(openClosed.contains(5)); // true

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.