Как проверить, находится ли целое число в заданном диапазоне? - PullRequest
58 голосов
/ 07 апреля 2011

Надеясь на что-то более элегантное, чем

if (i>0 && i<100) 

Ответы [ 18 ]

160 голосов
/ 07 апреля 2011

Вы можете добавить интервал;)

if (i > 0 && i < 100) 
25 голосов
/ 18 сентября 2015

Я думаю

if (0 < i && i < 100) 

более элегантно.Похоже на математическое уравнение.

Если вы ищете что-то особенное, вы можете попробовать:

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

, по крайней мере, он использует библиотеку.

22 голосов
/ 17 ноября 2016

Для тех, кто использует общий язык, можно использовать Диапазон :

Range<Integer> myRange = Range.between(100, 500);
if (myRange.contains(200)){
    // do something
}

См. Также: Как создать Apache Commons 3.1 Диапазон Объект

7 голосов
/ 07 апреля 2011

Я не понимаю, как это не элегантно, но если вы часто повторяете выражение, то было бы неплохо поместить его в метод, например,

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

Это особенно верно, если вы смешиваете эксклюзивные и инклюзивные сравнения. Имя метода может помочь избежать опечаток, таких как использование <когда <= должно было использоваться. Метод также может позаботиться о том, чтобы min <max и т. Д. </p>

4 голосов
/ 18 сентября 2015

Если вы ищете что-то более оригинальное, чем

if (i > 0 && i < 100)

, вы можете попробовать это

import static java.lang.Integer.compare;
...
if(compare(i, 0) > compare(i, 100))
4 голосов
/ 03 апреля 2014

Этот парень сделал хороший диапазон класс.

Однако его использование не приведет к хорошему коду, поскольку это универсальный класс. Вы должны напечатать что-то вроде:

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

или (несколько лучше, если вы реализуете сначала):

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

Семантически оба ИМХО более хороши, чем то, что Java предлагает по умолчанию, но накладные расходы памяти, снижение производительности и увеличение общего набора текста стоили того. Лично мне больше нравится подход mdma .

3 голосов
/ 20 июля 2018
ValueRange range = java.time.temporal.ValueRange.of(minValue, maxValue);
range.isValidIntValue(x);

возвращает значение true, если minValue <= x <= MaxValue - т.е. в пределах диапазона </p>

, возвращает значение false, если x или x> maxValue - т.е. вне диапазона

Используйте с условием if, как показано ниже:

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.");
}

ниже программных проверок, если любое из переданных целочисленных значений в методе hasTeen находится в диапазоне от 13 (включительно) до 19 (включительно)


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;
    }
}

****** ВЫХОД ******

верно, поскольку 19 является частью диапазона

верно, как 15 является частьюдиапазон

false, поскольку все три значения вышли за пределы диапазона

3 голосов
/ 14 февраля 2018

Я думаю, что это уже элегантный способ сравнения дальности.Но этот подход заставляет вас писать дополнительные модульные тесты для удовлетворения всех && случаев.

Таким образом, вы можете использовать любой из приведенных ниже подходов, чтобы избежать написания дополнительных модульных тестов.

Использование потоков Java 8:

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

Использование класса Math:

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

Лично я рекомендую второй подход, потому что он не закончитсясоздание массива размером, равным диапазону, который вы хотите проверить.

2 голосов
/ 25 мая 2017

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

Это будет работать.

2 голосов
/ 07 апреля 2011
if ( 0 < i && i < 100)  

if ( 'a' <= c && c <= 'z' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...