在if语句中格式化多个'或'条件的最佳方法(Java)

时间:2011-09-30 00:30:15

标签: java syntax if-statement

一个简单的问题,但谷歌没有多少帮助。

我有一个包含许多条件的if语句(必须检查10或15个常量以查看是否存在任何一个。)

而不是写下像:

if (x == 12 || x == 16 || x == 19 || ...)

有没有办法像

那样格式化它
if x is [12, 16, 19]?

只是想知道是否有更简单的方法来编码,任何帮助表示赞赏。

编辑:答案非常有帮助,但有人要求我添加更多细节,以便我满足他们的好奇心。我正在制作一个日期验证课程,需要确保日期不是> 30个月里只有30天(其中有4个,我想)我正在写一个if语句来检查这样的事情:

if (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11))

我只是想知道是否有更快的方法来编写类似的东西 - 下面的许多答案都有帮助:)。

7 个答案:

答案 0 :(得分:44)

我经常使用这种模式。它非常紧凑:

// Define a constant in your class. Use a HashSet for performance
private static final Set<Integer> values = new HashSet<Integer>(Arrays.asList(12, 16, 19));

// In your method:
if (values.contains(x)) {
    ...
}

这里使用HashSet来提供良好的查找性能 - 即使非常大的哈希集也能够非常快速地执行contains()

如果性能不重要,您可以将其要点编码为一行:

if (Arrays.asList(12, 16, 19).contains(x))

但要知道每次执行时都会创建一个新的ArrayList

答案 1 :(得分:10)

你想切换到这个??

switch(x) {
    case 12:
    case 16:
    case 19: 
        //Do something
        break;
    default:
        //Do nothing or something else..
        break;
}

答案 2 :(得分:3)

您可以查找是否存在地图键,或查看它是否在一个集合中。

根据您实际上正在做什么,您可能会尝试解决问题:)

答案 3 :(得分:3)

使用某种类型的集合 - 这将使代码更具可读性并隐藏所有这些常量。一个简单的方法是列表:

// Declared with constants
private static List<Integer> myConstants = new ArrayList<Integer>(){{
    add(12);
    add(16);
    add(19);
}};

// Wherever you are checking for presence of the constant
if(myConstants.contains(x)){
    // ETC
}

正如波希米亚人指出的那样,常量列表可以是静态的,因此它可以在多个地方访问。

对于任何感兴趣的人,我的示例中的列表使用double brace initialization。自从我最近遇到它以来,我发现它很适合快速写入&amp;脏列表初始化。

答案 4 :(得分:3)

如果可能性是“紧凑”(即最大值 - 最小值,比如说,小于200),您可以考虑查找表。如果您有像

这样的结构,这将特别有用
if (x == 12 || x == 16 || x == 19 || ...)
else if (x==34 || x == 55 || ...)
else if (...)

设置一个数组,其中包含标识要采取的分支的值(上例中的1,2,3),然后您的测试成为

switch(dispatchTable[x])
{
    case 1:
        ...
        break;
    case 2:
        ...
        break;
    case 3:
        ...
        break;
}

这是否合适取决于问题的语义。

如果数组不合适,您可以使用Map<Integer,Integer>,或者如果您只想测试单个语句的成员资格,Set<Integer>就可以。然而,对于一个简单的if语句来说,这是一个很大的火力,所以如果没有更多的语境,就很难引导你朝着正确的方向前进。

答案 5 :(得分:3)

不,你不能用Java做到这一点。但是你可以写一个方法如下:

boolean isContains(int i, int ... numbers) {
    // code to check if i is one of the numbers
    for (int n : numbers) {
        if (i == n) return true;
    }
    return false;
}

答案 6 :(得分:2)

使用Java 8,您可以使用基本流:

from .address import Address

但这可能会有轻微的开销(或不是),具体取决于比较次数。