Як перевірити, чи знаходиться ціле число в заданому діапазоні?


84

Сподіваючись на щось більш елегантне, ніж

if (i>0 && i<100) 

8
Що поганого в тому, що у вас є?
GreenMatt

3
Очевидним рішенням є наявність, class RangeChecker<Integer>і я впевнений, що ви можете заповнити деталі звідти.
corsiKa

7
можливо ОП сподівався на семантичну можливість, подібну МІЖ УSELECT * FROM aTable WHERE aDate BETWEEN lower AND upper
Сімен С

16
Подібно до цікавості, Python дозволяє синтаксис 0 < i < 100для таких тестів.
Greg Hewgill

Відповіді:


201

Ви можете додати інтервал;)

if (i > 0 && i < 100) 

10
не стискайте мій стиль! ні, я зазвичай космос це так.
herpderp

12
За пропозицією є те , що , так як ми зазвичай пишуть що - щось на зразок «0 <I <100», приємно слідувати , що якомога більше , щоб зробити код трохи легше читати: 0 < i && i < 100. Трохи дивно мати константу зліва 0 < i, але я думаю, що варто мати загальний вираз, який найбільше схожий 0 < ... < 100.
Джошуа Тейлор


32

Я думаю

if (0 < i && i < 100) 

більш елегантний. Схоже на математичне рівняння.

Якщо ви шукаєте щось особливе, ви можете спробувати:

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

принаймні він використовує бібліотеку.


6
Зверніть увагу, що 2-е рішення є включним, 1-е - ні.
holmis83

Чи не повинно бути Math.min(i, 99)? Тому що якщо я ввійду, 100це все одно повернеться правдою. Думаю, Math.max(0, i) == Math.min(i, 100)працює на 0 < i <= 100
Іршу

9

Я думаю, що це вже елегантний спосіб порівняння дальності. Але такий підхід змушує вас писати додаткові модульні тести, щоб задовольнити всі &&випадки.

Отже, ви можете використовувати будь-який із наведених нижче підходів, щоб уникнути написання зайвих модульних тестів.

Використання Java 8 Streams:

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

Використання класу математики:

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

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


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

вона повертає true, якщо minValue <= x <= MaxValue - тобто в межах діапазону

він повертає значення false, якщо x <minValue або 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;
    }
}

****** ВИХІД ******

true, оскільки 19 є частиною діапазону

true, оскільки 15 є частиною діапазону

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


Приємно, я використовував його в таких умовах, як -if(ValueRange.of(90, 100).isValidIntValue(91)) { "Value is in range." }
Яш

7

Я не розумію, як це не елегантно, але якщо ви часто повторюєте вираз, то корисно застосувати його до методу, наприклад

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

Це особливо вірно, якщо ви поєднуєте ексклюзивні та інклюзивні порівняння. Назва методу може допомогти уникнути помилок, таких як використання <, коли <= слід було використовувати. Метод також може подбати про те, щоб min <max тощо.


9
Це гарна ідея, доки хтось не вкладе boolean accepted = MathUtil.betweenExclusive(min,max,x);і не замутить замовлення. :(
corsiKa

Я знаю! Ой У цих випадках об’єкт Range може бути корисним.
mdma

Мій об’єкт RangeChecker насправді був жартом, але, заднім числом, насправді це не так вже й погано рішення (навіть якщо воно
надмірне

Було б краще, якби це був метод, безпосередньо визначений у Integerкласі. Коли ви це робите, немає нульової плутанини; myNum.isBetween(min, max)
Бурак,

Простий приклад: у мене є список людей з їх віком, і я хочу перевірити, чи є кожен із них похилого віку, середнього віку, дитини чи малюка. Я можу назвати діапазони віків, і тоді мій код цілком читабельний. Або я можу мати багато> і <, і мій код є безглуздям.
Михайло Батцер

5

Якщо ви шукаєте щось більш оригінальне, ніж

if (i > 0 && i < 100)

Ви можете спробувати це

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

4

Цей хлопець зробив гарний клас Range .

Однак його використання не дасть приємного коду, оскільки це загальний клас. Вам довелося б набрати щось на зразок:

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

або (дещо краще, якщо ви впровадите спочатку):

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

З семантичної точки зору IMHO приємніші за те, що Java пропонує за замовчуванням, але накладні витрати на пам’ять, погіршення продуктивності та введення в цілому загалом того варті. Особисто мені більше подобається підхід mdma .


1
Сторінку не знайдено для URL-адреси класу діапазону.
shridutt kothari

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

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

1
Крім непослідовних інтервалів у першому прикладі ідеально!
Якуб Хампл

1
Шкода, що правило 6 символів запобігає будь-яким виправленням інтервалів.
Мартін

1
Краща перевірка знаківif (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
Октавія Тогамі

1
@ ıɯɐƃoʇǝızuǝʞ Ще краще:Character.isLetter(c)
Роланд Ілліг,

2

якщо (i <= 0 || i> = 100)

Це спрацює.


це заперечує початковий стан і не забезпечує більш елегантного рішення
PJMeisch

1

Ось як ви перевіряєте, чи є ціле число в діапазоні. Більше нижньої межі, менше верхньої межі. Намагаючись бути розумним із відніманням, швидше за все, ви не зробите те, що ви хочете.


Намагання бути розумним із відніманням може призвести до перевищення чи перевищення цілих чисел і отримати неправильний результат.
corsiKa

1

Спробуйте:

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

це буде працювати принаймні;)


1

Використовуйте цей код:

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

0

Якщо ви впевнені, що цифри зберігаються у формі доповнення 2:

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

Більш загальним та безпечним рішенням буде:

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

0

якщо ви використовуєте дані Spring, ви також можете використовувати об'єкт Range від Spring.

range = new org.springframework.data.domain.Range (3, 8); range.contains (5) поверне true.


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

0

Бібліотека Java Java Google Guava також реалізує діапазон :

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.