格式化多个';或';if语句中的条件(Java)
这是一个简单的问题,但谷歌帮不了多少忙 我有一个包含许多条件的if语句(必须检查10或15个常量,看看是否存在其中任何一个。) 而不是像这样写:格式化多个';或';if语句中的条件(Java),java,syntax,if-statement,Java,Syntax,If Statement,这是一个简单的问题,但谷歌帮不了多少忙 我有一个包含许多条件的if语句(必须检查10或15个常量,看看是否存在其中任何一个。) 而不是像这样写: if (x == 12 || x == 16 || x == 19 || ...) 有没有办法把它格式化成这样 if x is [12, 16, 19]? 只是想知道是否有一个更简单的方法来编码这个,任何帮助表示感谢 编辑:答案非常有用,但有几个人要求我补充更多细节,所以我会这样做以满足他们的好奇心。我正在制作一个日期验证类,需要确保在只有30天的
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))
我只是想知道是否有更快的方法来编写类似的代码-下面的许多答案都有帮助:)。您可以查找地图键的存在或查看它是否在一个集合中
但是,根据您实际执行的操作,您可能试图解决错误的问题:)使用某种类型的集合-这将使代码更具可读性并隐藏所有这些常量。一个简单的方法是列出:
// 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
}
//用常量声明
私有静态列表myConstants=newArrayList(){{
增加(12);
增加(16);
增加(19);
}};
//无论您在哪里检查常量的存在
if(myConstants.contains(x)){
//等
}
正如波希米亚人指出的,常数列表可以是静态的,因此可以在多个地方访问
对于任何感兴趣的人,我的示例中的列表都使用了。自从我最近遇到它以来,我发现它非常适合编写快速脏列表初始化。你想切换到这个吗
switch(x) {
case 12:
case 16:
case 19:
//Do something
break;
default:
//Do nothing or something else..
break;
}
如果一组可能性是“紧凑”(即最大值-最小值,即小于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;
}
这是否合适取决于问题的语义
如果数组不合适,可以使用
映射
,或者如果只想测试单个语句的成员资格,则可以使用集
。但是,对于一个简单的if
语句来说,这是一个很大的火力,因此如果没有更多的上下文,就很难将您引导到正确的方向。我经常使用这种模式。它非常紧凑:
// 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)) {
...
}
但是要知道,它每次执行时都会创建一个新的
ArrayList
。不,在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;
}
使用Java 8,您可以使用基本流:
if (IntStream.of(12, 16, 19).anyMatch(i -> i == x))
但这可能会有轻微的开销(或没有),这取决于比较的次数。您能举一个更好的例子来说明您要做什么吗?也许一个解决方案就在于考虑这个?或者
if(Arrays.asList(newint[]{12,16,19}).contains(x)){…}
@Bala-sure!无论如何,列表只是此处使用的集合的一个示例。正如另一个答案所建议的那样,设置一组可能更好地确保常数是唯一的。。。如果(Arrays.asList(12,16,19).contains(x)),我宁愿使用Set
而不是List
,但这对这几个元素没有任何影响。@Joachim Sauer采纳了你的想法-这也是一个好主意!HashSet会快很多:private static final ImmutableSet value=ImmutableSet.of(12,16,19)代码>
if (IntStream.of(12, 16, 19).anyMatch(i -> i == x))