Сподіваючись на щось більш елегантне, ніж
if (i>0 && i<100)
Сподіваючись на щось більш елегантне, ніж
if (i>0 && i<100)
class RangeChecker<Integer>
і я впевнений, що ви можете заповнити деталі звідти.
SELECT * FROM aTable WHERE aDate BETWEEN lower AND upper
0 < i < 100
для таких тестів.
Відповіді:
Ви можете додати інтервал;)
if (i > 0 && i < 100)
0 < i && i < 100
. Трохи дивно мати константу зліва 0 < i
, але я думаю, що варто мати загальний вираз, який найбільше схожий 0 < ... < 100
.
Для тих, хто використовує спільну мову, можна використовувати Range :
Range<Integer> myRange = Range.between(100, 500);
if (myRange.contains(200)){
// do something
}
Також див.: Як побудувати об’єкт apache commons 3.1 Range <Integer>
Я думаю
if (0 < i && i < 100)
більш елегантний. Схоже на математичне рівняння.
Якщо ви шукаєте щось особливе, ви можете спробувати:
Math.max(0, i) == Math.min(i, 100)
принаймні він використовує бібліотеку.
Math.min(i, 99)
? Тому що якщо я ввійду, 100
це все одно повернеться правдою. Думаю, Math.max(0, i) == Math.min(i, 100)
працює на 0 < i <= 100
Я думаю, що це вже елегантний спосіб порівняння дальності. Але такий підхід змушує вас писати додаткові модульні тести, щоб задовольнити всі &&
випадки.
Отже, ви можете використовувати будь-який із наведених нижче підходів, щоб уникнути написання зайвих модульних тестів.
Використання Java 8 Streams:
if(IntStream.rangeClosed(0,100).boxed().collect(Collectors.toList()).contains(i))
Використання класу математики:
if(Math.max(0, i) == Math.min(i, 100))
Особисто я рекомендую другий підхід, оскільки він не закінчиться створенням масиву розміром, рівним діапазону, який ви хочете перевірити.
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." }
Я не розумію, як це не елегантно, але якщо ви часто повторюєте вираз, то корисно застосувати його до методу, наприклад
class MathUtil
{
public static boolean betweenExclusive(int x, int min, int max)
{
return x>min && x<max;
}
}
Це особливо вірно, якщо ви поєднуєте ексклюзивні та інклюзивні порівняння. Назва методу може допомогти уникнути помилок, таких як використання <, коли <= слід було використовувати. Метод також може подбати про те, щоб min <max тощо.
boolean accepted = MathUtil.betweenExclusive(min,max,x);
і не замутить замовлення. :(
Integer
класі. Коли ви це робите, немає нульової плутанини; myNum.isBetween(min, max)
Цей хлопець зробив гарний клас Range .
Однак його використання не дасть приємного коду, оскільки це загальний клас. Вам довелося б набрати щось на зразок:
if (new Range<Integer>(0, 100).contains(i))
або (дещо краще, якщо ви впровадите спочатку):
class IntRange extends Range<Integer>
....
if (new IntRange(0,100).contains(i))
З семантичної точки зору IMHO приємніші за те, що Java пропонує за замовчуванням, але накладні витрати на пам’ять, погіршення продуктивності та введення в цілому загалом того варті. Особисто мені більше подобається підхід mdma .
if ( 0 < i && i < 100)
if ( 'a' <= c && c <= 'z' )
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
Character.isLetter(c)
якщо (i <= 0 || i> = 100)
Це спрацює.
Ось як ви перевіряєте, чи є ціле число в діапазоні. Більше нижньої межі, менше верхньої межі. Намагаючись бути розумним із відніманням, швидше за все, ви не зробите те, що ви хочете.
Використовуйте цей код:
if (lowerBound <= val && val < upperBound)
or
if (lowerBound <= val && val <= upperBound)
Range<Long> timeRange = Range.create(model.getFrom(), model.getTo());
if(timeRange.contains(systemtime)){
Toast.makeText(context, "green!!", Toast.LENGTH_SHORT).show();
}
Бібліотека 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