在Java中,对于带有大量||

时间:2017-03-19 01:07:46

标签: java

我知道这个问题是基本的,但我正在寻找一种不太笨拙的方法来处理以下if语句:

if ((sOne.Contains('*')) || (sOne.Contains('/')) || (sOne.Contains('-')) || (sOne.Contains('+')) || (sOne.Contains('%'))){ 

我还应该注意sOne.Contains()引用以下代码......

public boolean Contains(char key) {
    // Checks stack for key
    boolean retval = arrs.contains(key);
    return retval;

}

还应该注意的是,这五个字符永远不会改变。

7 个答案:

答案 0 :(得分:6)

你可以在字符数组上使用break-each循环:

for (char c : "*/-+%".toCharArray()) {
    if (sOne.Contains(c)) {
        // ...
        break;
    }
}

如果您非常关注性能,可能还需要提取toCharArray()调用并将结果缓存为static final char[]常量。

您甚至可以使用此策略在sOne对象上定义其他便捷方法,例如ContainsAnyContainsAll(信用Sina Madrid获取名称ContainsAny }):

public boolean ContainsAny (CharSequence keys) {
    for (int i = 0; i < keys.length; i++)
        if (Contains(keys.charAt(i)) return true;

    return false;
}

public boolean ContainsAll (CharSequence keys) {
    for (int i = 0; i < keys.length; i++)
        if (!Contains(keys.charAt(i)) return false;

    return true;
}

用法看起来像这样:

if (sOne.ContainsAny("*/-+%")) {
    // ...
}

答案 1 :(得分:4)

您可以尝试使用这样的正则表达式

if (sOne.matches(".*[-*/+%].*")) {
  // your code
}

答案 2 :(得分:4)

某处,您需要列表中的字符:

List<Character> keys = Arrays.asList('*', '/', '-', '+', '%');

然后你可以这样做:

if (keys.stream().anyMatch(sOne::Contains)) {

答案 3 :(得分:1)

这个方法怎么样: 项目是存储在数组中的密钥。

public static boolean stringContainsItemFromList(String inputStr, String[] items)
{
    for(int i =0; i < items.length; i++)
    {
        if(inputStr.contains(items[i]))
        {
            return true;
        }
    }
    return false;
}

答案 4 :(得分:1)

您没有显示 arr 是什么,但由于它有包含方法,我将假设它是一个集合。因此,如果您将密钥放入静态集合(如Set)中,并且 arr 也是某种类型的集合,则可以使用 Collections.disjoint 。如果两个集合之间没有交集,不相交将返回true。

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

public class Test {
  static Set<Character> keys = new HashSet<Character>(Arrays.asList('*','/','-','+','%'));

  static class SOne {
    Set<Character> arrs = null;
    SOne(String line) {
      arrs = line.chars().mapToObj(e->(char)e).collect(Collectors.toSet());
    }
    public boolean Contains(Set<Character> checkset) {
      return !Collections.disjoint(arrs, checkset);
    }
  }

  static public void main(String args[]) {
    SOne sOne = new SOne("Does not contain");
    SOne sTwo = new SOne("Does contain a + sign");

    if(sOne.Contains(keys)) {
      System.out.println("Fail: Contains a key");
    } else {
      System.out.println("Pass: Does not contain a key");
    }

    if(sTwo.Contains(keys)) {
      System.out.println("Pass: Contains a key");
    } else {
      System.out.println("Fail: Does not contain a key");
    }
  }
}

答案 5 :(得分:1)

您可以编写这样的方法并仍然重复使用现有方法(将T替换为sOne的类型):

static <T> boolean ContainsAny(T sOne, char... keys) {
    for (char key : keys) {
        if (sOne.Contains(key))
            return true;
    }
    return false;
}

然后您可以使用任意数量的字符来调用它来进行评估:

if (ContainsAny(sOne, '%', '_', '-')) {
    //code here
}

答案 6 :(得分:0)

如果您只在一个地方使用此表单的if语句,那么保持相同的结构但只是更整齐地格式化就可以了:

if (sOne.contains('+') ||
    sOne.contains('-') ||
    sOne.contains('*') ||
    sOne.contains('/') ||
    sOne.contains('%')) {
    ...
}

P.S。在您的方法中,没有必要定义boolean变量只是为了立即返回它;您可以直接返回其他方法的结果:

public boolean contains(char key) {
    // Checks stack for key
    return arrs.contains(key);
}

请注意命名约定:方法名称(contains)应以小写字母开头。