在一个expression式中比较一个string与多个值

我有一个stringvariables, str可能的值, val1val2val3

我想用一个if语句来比较(等于大小写) str到所有这些值,例如:

 if("val1".equalsIgnoreCase(str)||"val2".equalsIgnoreCase(str)||"val3.equalsIgnoreCase(str)) { //remaining code } 

有没有办法避免使用多个OR(||)运算符并比较一个expression式中的值? 例如,像这样:

  if(("val1" OR "val2" OR "val3").equalsIgnoreCase(str) //this is only an idea. 

我find了一个更好的解决scheme。 这可以使用RegEx实现:

 if (str.matches("val1|val2|val3")) { // remaining code } 

对于不区分大小写的匹配:

 if (str.matches("(?i)val1|val2|val3")) { // remaining code } 

在Java 8+中,你可以使用Stream<T>anyMatch(Predicate<? super T>)

 if (Stream.of("val1", "val2", "val3").anyMatch(x -> str.equalsIgnoreCase(x))) { // ... } 

你可以将所有想要比较str的string存储到一个集合中,并检查集合是否包含str 。 将集合中的所有string存储为小写,并在查询集合之前将str转换为小写。 例如:

 Set<String> strings = new HashSet<String>(); strings.add("val1"); strings.add("val2"); String str = "Val1"; if (strings.contains(str.toLowerCase())) { } 

小改进完美有效的@ hmjd的答案 :您可以使用以下语法:

 class A { final Set<String> strings = new HashSet<>() {{ add("val1"); add("val2"); }}; // ... if (strings.contains(str.toLowerCase())) { } // ... } 

它允许你初始化你就地Set

只需使用var-args并编写自己的静态方法:

 public static boolean compareWithMany(String first, String next, String ... rest) { if(first.equalsIgnoreCase(next)) return true; for(int i = 0; i < rest.length; i++) { if(first.equalsIgnoreCase(rest[i])) return true; } return false; } public static void main(String[] args) { final String str = "val1"; System.out.println(compareWithMany(str, "val1", "val2", "val3")); } 

ArrayUtils可能会有所帮助。

 ArrayUtils.contains(new String[]{"1", "2"}, "1") 

你可以通过Collections框架实现这一点。 把所有的选项放​​在一个集合中,比如Collection<String> options ;

然后循环throgh这个比较你的string与列表元素,如果是你可以返回一个布尔值true和否则为false。

在Java中记住一个引用的String仍然是一个String对象。 因此,您可以使用String函数contains()来使用此方法testing一系列string或整数:

 if ("AC Viking GM Ocelot".contains(mAnswer)) {...} 

对于数字来说,这是一个更多的参与,但仍然有效:

 if ("1 4 5 9 10 17 23 96457".contains(String.valueOf(mNumAnswer))) {...} 

不,没有这种可能性。 总而言之,可以想象:

 public static boolean contains(String s, Collection<String>c) { for (String ss : c) { if (s.equalsIgnoreCase(ss)) return true; } return false; } 
 !string.matches("a|b|c|d") 

对我来说工作得很好。