如何用Java表示范围?

황현정*_*황현정 41 java

假设一个整数应该在以下范围内: [0...2147483647]

我想检查整数变量是否在此范围内.我知道它可以通过简单的if-else语句来完成,但有没有更有效的方法来检查它是否在范围内?

我宁愿不这样做:

if (foo >= 0 && foo <= 2147483647) 
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

小智 49

Apache Commons Lang有一个用于执行任意范围的Range.

Range<Integer> test = Range.between(1, 3);
System.out.println(test.contains(2));
System.out.println(test.contains(4));
Run Code Online (Sandbox Code Playgroud)

番石榴Range有类似的API.

如果您只是想检查数字是否适合长值或int值,您可以尝试使用它BigDecimal.有对方法longValueExactintValueExact抛出异常的,如果值太大,对那些精度.

  • 是的,但您认为`.contains(...)`是如何实现的?;)(使用if/else肯定:) (2认同)

ScA*_*er2 20

您可以创建一个类来表示它

public class Range
{
    private int low;
    private int high;

    public Range(int low, int high){
        this.low = low;
        this.high = high;
    }

    public boolean contains(int number){
        return (number >= low && number <= high);
    }
}
Run Code Online (Sandbox Code Playgroud)

样品用法:

Range range = new Range(0, 2147483647);

if (range.contains(foo)) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)


Jef*_*att 12

我知道这是一个相当古老的问题,但是使用Java 8的Streams,你可以得到一系列int像这样的:

// gives an IntStream of integers from 0 through Integer.MAX_VALUE
IntStream.rangeClosed(0, Integer.MAX_VALUE); 
Run Code Online (Sandbox Code Playgroud)

然后你可以做这样的事情:

if (IntStream.rangeClosed(0, Integer.MAX_VALUE).matchAny(n -> n == A)) {
    // do something
} else {
    // do something else 
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常缓慢的解决方案。您正在进行20亿次比较,而不是2次。 (2认同)

tsk*_*zzy 7

如果您要检查很多间隔,我建议使用间隔树.

  • 是否有一个已知的实现间隔树的Java库? (2认同)

PhD*_*PhD 5

无论你尝试优化这个不那么密集的计算的效率如何,你都会有一个 if-check :) 你可以从数字中减去上限,如果它是正值,你就知道你超出了范围。您也许可以执行一些布尔位移逻辑来弄清楚它,如果您愿意,您甚至可以使用费马定理(开玩笑:)但重点是“为什么”您需要优化此比较?目的是什么?

  • 你一定是在开玩笑——慢?就像你测得它表现不佳一样? (3认同)
  • 我支持OP——这种程序检查总是让人感觉很尴尬。我更喜欢声明式合同(如果可用),即使前者最终会缩减为后者。 (2认同)

c0d*_*der 5

您可以使用java.time.temporal.ValueRangewhich接受long,也可以使用int

int a = 2147;

//Use java 8 java.time.temporal.ValueRange. The range defined
//is inclusive of both min and max 
ValueRange range = ValueRange.of(0, 2147483647);

if(range.isValidValue(a)) {
    System.out.println("in range");
}else {
    System.out.println("not in range");
}
Run Code Online (Sandbox Code Playgroud)