一个简单的问题,但谷歌没有多少帮助。
我有一个包含许多条件的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))
我只是想知道是否有更快的方法来编写类似的东西 - 下面的许多答案都有帮助:)。
答案 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
但这可能会有轻微的开销(或不是),具体取决于比较次数。