정수가 주어진 범위에 있는지 확인하는 방법은 무엇입니까?


84

보다 우아한 것을 바라고

if (i>0 && i<100) 

8
당신이 가진 것에 무슨 문제가 있습니까?
GreenMatt 2011

3
명백한 해결책은 a를 갖는 것이며 class RangeChecker<Integer>거기에서 세부 사항을 채울 수 있다고 확신합니다.
corsiKa 2011

7
아마도 OP는 BETWEEN과 유사한 의미 론적 가능성을 기대하고있었습니다SELECT * FROM aTable WHERE aDate BETWEEN lower AND upper
Simen S

17
흥미로운 점과 마찬가지로 Python은 0 < i < 100이와 같은 테스트를위한 구문 을 허용합니다 .
Greg Hewgill 2011

2
apache commons 클래스 org.apache.commons.lang.math.IntRange 가 적합 할 수 있습니다.
Abhishek

답변:


201

간격을 추가 할 수 있습니다.)

if (i > 0 && i < 100) 

10
내 스타일을 겁 먹지마! 아니 나는 보통 그렇게 간격을 둡니다.
herpderp 2011

12
제안에 따르면 일반적으로 "0 <i <100"과 같이 작성하므로 코드를 좀 더 쉽게 읽을 수 있도록 가능한 한 많이 따르는 것이 좋습니다 0 < i && i < 100.. 에서 왼쪽에 상수가있는 것은 조금 이상 0 < i하지만, 전체적으로 0 < ... < 100.
Joshua Taylor


32

나는 생각한다

if (0 < i && i < 100) 

더 우아합니다. 수학 방정식처럼 보입니다.

특별한 것을 찾고 있다면 다음을 시도해 볼 수 있습니다.

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

적어도 그것은 라이브러리를 사용합니다.


6
두 번째 솔루션은 포괄적이고 첫 번째 솔루션은 그렇지 않습니다.
holmis83

Math.min(i, 99)그래? 입력 100하면 여전히 true를 반환하기 때문입니다. 내 생각 Math.max(0, i) == Math.min(i, 100)에 대한 작품을 0 < i <= 100
Irshu

9

나는 이미 범위를 비교하는 우아한 방법이라고 생각합니다. 그러나이 접근 방식을 사용하면 모든 &&경우 를 충족하기 위해 추가 단위 테스트를 작성해야 합니다.

따라서 추가 단위 테스트 작성을 방지하기 위해 아래 방법 중 하나를 사용할 수 있습니다.

자바 8 스트림 사용 :

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

Math 클래스 사용 :

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

개인적으로 확인하려는 범위와 동일한 크기의 배열을 생성하지 않기 때문에 두 번째 방법을 권장합니다.


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

minValue <= x <= MaxValue-즉 범위 내에 있으면 true를 반환합니다.

x <minValue 또는 x> maxValue-즉 범위를 벗어난 경우 false를 반환합니다.

아래와 같이 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


니스, 나는 조건과 같은 경우에 그것을 사용했다 -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 2011

알아! 아야. 이러한 경우 Range 개체가 유용 할 수 있습니다.
mdma 2011

내 RangeChecker 객체는 실제로 농담 이었지만, 돌이켜 보면, 그것은 실제로 솔루션의 나쁘지 않다 (이 잔인한 경우에도 마찬가지입니다.)
corsiKa

Integer클래스 에서 직접 정의 된 메소드라면 더 좋을 것 입니다. 그렇게 할 때 혼동이 없습니다. myNum.isBetween(min, max)
Burak

간단한 예 : 나는 그들의 나이가있는 사람들의 목록을 가지고 있고, 그들 각각이 노인, 중년, 어린이 또는 유아인지 확인하고 싶습니다. 이름이 지정된 연령 범위를 가질 수 있으며 코드를 읽을 수 있습니다. 또는> 및 <를 많이 가질 수 있으며 내 코드는 횡설수설합니다.
Mikhail Batcer

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))

의미 상 둘 다 Java가 기본적으로 제공하는 것보다 IMHO가 더 좋지만 메모리 오버 헤드, 성능 저하 및 전체적으로 더 많은 입력이 그만한 가치가 있습니다. 개인적으로 mdma의 접근 방식이 더 좋습니다.


1
범위 클래스 URL에 대한 페이지를 찾을 수 없습니다.
shridutt Kothari의



1

그것이 정수가 범위에 있는지 확인하는 방법입니다. 하한보다 큼, 상한보다 작습니다. 빼기로 영리 해 지려고 노력하는 것은 당신이 원하는 것을하지 못할 것입니다.


뺄셈을 영리하게 사용하려고하면 정수 오버플로 또는 언더 플로가 발생하여 잘못된 결과를 얻을 수 있습니다.
corsiKa 2011

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 데이터를 사용하는 경우 Spring의 Range 개체를 사용할 수도 있습니다.

범위 = 새로운 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

Google의 Java Library Guava도 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

-4
    val = val < MIN ? MIN : ( val > MAX ? MAX : val);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.