【问题标题】:How can I compare multiple strings in an if statement with Java?如何将 if 语句中的多个字符串与 Java 进行比较?
【发布时间】:2012-09-01 12:31:58
【问题描述】:

我不完全确定如何措辞。我想知道如何检查变量中是否存在多个字符串之一。 有人告诉我这会起作用,但它并没有达到我的预期。

       String lett2array=arr[i];
       String[] lett=lett2array.split("");
       int y = 0;
       while(y != lett.length){
           if(lett[1].equals("a")||lett[1].equals("e")||lett[1].equals("i")||lett[1].equals("o")||lett[1].equals("u")){
               inputField.append(" \n"+lett[y]);
           }

【问题讨论】:

  • 你想究竟做什么?
  • lett的类型是什么?你想做什么?
  • 您确定要lett[1] 而不是lett[y]
  • 你的while(y != lett.length) 循环永远不会终止,因为lett.lengthy 都不会改变。
  • @user1640491:为什么不使用 for 循环?

标签: java string if-statement


【解决方案1】:

你的代码写得很迂回。

  1. 没有必要在每个循环中检查字符串的第二个字母 - 事先检查并存储结果
  2. 当你想要一个字符数组时不要使用.split("")
  3. 使用 for 循环而不是使用 while 循环进行迭代

我是这样写的:

String str = arr[i];
char[] letters = str.toCharArray();

boolean secondLetterIsVowel = letters[1] == 'a'
                           || letters[1] == 'e'
                           || letters[1] == 'i'
                           || letters[1] == 'o'
                           || letters[1] == 'u';
for(char letter : letters) {
    if(secondLetterIsVowel) {
        inputField.append(" \n" + letter);
    }
    //...
}

【讨论】:

  • 不会是lett[0]吗?只是问一下,因为 Java 中的数组以索引 0 开头。不过,我什至不确定他是否想这样做。我认为他只是想通过一个字符串,只输出元音。
  • 来自问题的 cmets,“是的,我只想针对数组的第二个值进行测试
  • 好的。我的错。我会删除我的错误答案。
  • @eboix:我想我对startsWithVowel 造成了误导。改为secondLetterIsVowel!
  • 实际上这是我的错,在测试了这个(唯一一个我想要的)之后,我确实想要第一个索引。对不起,我现在很累,我犯了很多错误,但我想每个人都从某个地方开始。感谢您的帮助。
【解决方案2】:

使用 Apache Commons:

StringUtils.startsWithAny(String  string, String [] searchStrings) 

更多信息:http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html

问候,

【讨论】:

    【解决方案3】:

    你应该使用||,而不是|

    if(lett[1].equals("a") || lett[1].equals("e") || lett[1].equals("i") || lett[1].equals("o") || lett[1].equals("u")) {
        inputField.append(" \n"+lett[y]);
    }
    

    | 是按位或运算符,而|| 是短路逻辑或运算符。

    【讨论】:

    • 你确定它有那么大的不同吗?我不是。
    • @BorisStrandjev:使用|| 效率更高,因为它在达到真值时停止评估。
    • 这在大多数情况下是正确的,因为与| 比较将强制所有比较,而与|| 比较将在评估为true 的比较之一之后停止。
    • @Eric True,感谢您的详细说明,但这次我只想指出这并不能解决 OPs 问题(无论如何)
    • 在这种情况下(具体而言),它们之间没有逻辑上的区别。
    【解决方案4】:

    您使用过 | (按位或)而不是 || (逻辑或)

    当您想要“测试条件一或条件 2”时,请使用“||”。

    【讨论】:

    • | 也是一个逻辑或,但它不会很快失败。
    • 这种情况下没关系,不过你是对的,一般情况下应该使用||
    • @HovercraftFullOfEels:伙计,我只是喜欢你投反对票的速度。我想这是我在不到 4 分钟内看到的第四次......
    • @HovercraftFullOfEels:不确定您使用的术语,但通常称为短路评估。
    【解决方案5】:

    如果你有这样的事情:

    if( a.equals( b ) || a.equals( c ) || a.equals( d ) )
    

    你可以改写为:

    if( Arrays.asList( b,c,d).contains( a ) )
    

    当然,如果 b、c 和 d 是常量,您也可以将列表创建为常量。

    【讨论】:

    • 这不是效率低很多吗?
    • @Eric 如果您每次都创建数组,那就是。如果您可以将其提取为常数,则几乎相同。但在实践中几乎可以肯定这无关紧要。 (如果要比较的值很多,当然应该使用Set。)
    【解决方案6】:

    这是我的解决方案。使用charAt(int index)而不是split,时间复杂度为O(n),比较chars,而不是Strings,更快。

        String currString = arr[i]; // Get the current string
        char secondLet = currString.charAt(1); // Get the second letter
    
        // chars are primitive, so == will suffice
        if(secondLet == 'a' || secondLet == 'e'
            || secondLet == 'i' || secondLet == 'o' || secondLet == 'u') {
            // The second letter is a vowel!
            // Do whatever you want to do.......
            // I didn't understand if you wanted to output the whole String,
            // Or just the vowels. Whatever. Just do what you want.
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多