Compare uma String com vários valores em uma expressão

Eu tenho uma variável String, str com valores possíveis, val1 , val2 e val3 .

Eu quero comparar (com maiúsculas e minúsculas) str para todos esses valores usando uma instrução if, por exemplo:

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

Existe uma maneira de evitar o uso de múltiplos operadores OR (||) e comparar valores em uma expressão? Por exemplo, assim:

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

Eu encontrei a melhor solução. Isto pode ser conseguido através do RegEx:

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

Para correspondência insensível a maiúsculas e minúsculas:

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

No Java 8+, você pode usar um Stream e anyMatch(Predicate) com algo como

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

Você pode armazenar todas as strings com as quais deseja comparar str em uma coleção e verificar se a coleção contém str . Armazene todas as strings na coleção como minúsculas e converta str em minúscula antes de consultar a coleção. Por exemplo:

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

Pequeno aprimoramento para a resposta perfeitamente válida do @hmjd : você pode usar a seguinte syntax:

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

Ele permite que você inicialize Set in-place.

Apenas use var-args e escreva seu próprio método estático:

 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 pode ser útil.

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

Você pode conseguir isso com o framework Collections. Coloque todas as suas opções em uma Coleção dizendo algo como Collection options ;

Em seguida, faça um loop throgh isso para comparar sua seqüência de caracteres com os elementos da lista e se for, você pode retornar um valor booleano true e false.

Lembre-se em Java que uma String entre aspas ainda é um object String. Portanto, você pode usar a function String () para testar um intervalo de Strings ou inteiros usando este método:

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

para números é um pouco mais envolvido, mas ainda funciona:

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

Não, não existe essa possibilidade. Allthough, pode-se imaginar:

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

funciona bem para mim.