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

78

Ich hoffe auf etwas eleganteres als

if (i>0 && i<100) 
ich Idiot
quelle
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) 
Jakub Hampl
quelle
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.

Vitaly
quelle
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.

Sahil Chhabra
quelle
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

Arpan Saini
quelle
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 ..

mdma
quelle
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))
esin88
quelle
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.

velis
quelle
Seite für URL der Bereichsklasse nicht gefunden.
Shridutt Kothari
3
if ( 0 < i && i < 100)  

if ( 'a' <= c && c <= 'z' )
unwiderlegbar
quelle
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
2

if (i <= 0 || i> = 100)

Es wird klappen.

SenthilRaja Natarajan
quelle
das negiert den ursprünglichen Zustand und bietet keine elegantere Lösung
PJMeisch
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.

Borealid
quelle
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;)

Endi
quelle
1

Verwenden Sie diesen Code:

if (lowerBound <= val && val < upperBound)
or
if (lowerBound <= val && val <= upperBound)
Vishal Tathe
quelle
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);
Guru
quelle
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.

Maurice
quelle
0
 Range<Long> timeRange = Range.create(model.getFrom(), model.getTo());
    if(timeRange.contains(systemtime)){
        Toast.makeText(context, "green!!", Toast.LENGTH_SHORT).show();
    }
VIVEK CHOUDHARY
quelle
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
p13rr0m
quelle
-4
    val = val < MIN ? MIN : ( val > MAX ? MAX : val);
Beaudet
quelle