【问题标题】:How to check whether an int is within a range of values如何检查一个int是否在一个值范围内
【发布时间】:2013-11-07 04:26:20
【问题描述】:

在特定的if-else 中,我必须确定给定值是否在某个范围内。条件部分如下所示:

else if (a==2 && b.equalsIgnoreCase("line")
     && <<Here I need to search if c falls within a range>> && d)

其中 a 是 int,b 是字符串,c 是 int,d 是布尔值。现在如果 c 在 1 到 8 之间,则条件为真,否则为假。我该怎么做?

【问题讨论】:

  • 你想在哪里搜索c?
  • else-if的大括号部分。

标签: java if-statement


【解决方案1】:

我认为c 需要你这个条件

(c > 1 && c < 8) // 1 and 8 are exclusive
(c => 1 && c <= 8) // 1 and 8 are inclusive

完整样本

else if (a==2 && b.equalsIgnoreCase("line")
     && (c > 1 && c < 8) && d)

如果需要检查值是否属于一组值,则需要使用Set,然后检查c 是否属于该值。在您最初的问题中,它被提及为 a range,因此是答案。无论如何,这就是您可以检查集合中的值的方法。

Integer[] arr = {1,4,9,11,13};
Set<Integer> set = new HashSet<>(Arrays.asList(arr));
...
else if (a==2 && b.equalsIgnoreCase("line")
     && (set.contains(c)) && d)

【讨论】:

  • 如果值不是连续的?
  • 我不太明白,你的意思是什么。能给个样品吗?
  • 假设如果我想搜索c是否在{1,4,9,11,13}之内,那么呢?
  • @Mistu4u 在这种情况下,如果我不止一次使用它,我会创建一个HashSet&lt;Integer&gt;(我称之为set)并使用set.contains(c)
  • @Mistu4u 那不是范围,是集合,你应该使用Set
【解决方案2】:

惊喜惊喜,是c &gt;= low &amp;&amp; c &lt;= high

要响应更新,您需要使用一组

Set<Integer> validValues = new HashSet<Integer>();
validValues.add(1);
validValues.add(4);
validValues.add(9);
validValues.add(10);
validValues.add(19);

if (validValues.contains(currentVal)) {
    // do stuff
}

为了抑制 java 的冗长,你可以使用 Guava 的不可变集合:

Set<Integer> validValues = ImmutableSet.of(1, 4, 9, 10, 19);

【讨论】:

    【解决方案3】:

    这样试试,range1 和 range2 是你需要检查 b 的范围。

    (c < range1 && c >  range2) ? d=true : d=false;
    

    【讨论】:

    • 您误解了这个问题。你的答案的第一部分是正确的。但是,OP 不想要三元表达式,他想要 if 语句。尝试重新阅读问题。
    【解决方案4】:

    您只需添加:

    c > 1 && c < 8
    

    如果您觉得您的条件变得过于复杂,我建议您创建布尔方法来稍微简化它们。这是一个非常温和的情况,但例如这个范围问题可以表示为:

    public boolean inRange(int num)
    {
        return (num > 1 && num < 8);
    }
    

    【讨论】:

    • 为什么是Booleanboolean 几乎总是足够的。
    【解决方案5】:

    不幸的是,唯一的方法是使用 if else 语句(据我所知)。 switch 语句不接受条件运算符,因此不适用于此。正如其他人所建议的那样,您可以使用单独的方法,因为这些方法可以让您检查其他值是否也在范围内。但是,您可以选择像

    这样的东西,而不仅仅是这个值
    public Boolean inRange(int num, int lowBound, int topBound)
    {
        return (num > lowBound && num < topBound);
    
    }
    

    然后像这样在你的代码中使用它

    else if (a==2 && b.equalsIgnoreCase("line")
         && inBound(c, 1, 8) && d)
    

    它看起来不会太杂乱,并且可以工作(但您需要确定它是包含边界还是排他边界)。

    更改方法的原因是它也可以在其他地方使用,使其对范围检查有用。

    【讨论】:

    • 我个人不认为(num &gt; lowBound &amp;&amp; num &lt; topBound) 很乱。然而,当我在一个语句中加入许多条件时,我几乎总是分行。我会使用else if (a == 2 \\new line``&amp;&amp; b.equalsIgnoreCase("line") \\nl``&amp;&amp; (c &gt; 1 &amp;&amp; c &lt; 8) \\nl``&amp;&amp; d
    • 这就是我的意思——不要太乱。无论如何,分割线是好的。虽然,如果视觉效果是这个人想要的,那么你也可以嵌套它们——这并没有太大的性能变化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多