【问题标题】:dynamic if statement for string字符串的动态 if 语句
【发布时间】:2018-07-07 14:24:30
【问题描述】:

如果我有 3 个字符串变量 string1 string2 和 string3 并且根据用户输入,其中一些变量可能为空,我将如何做?我想将这些变量与我已经设置的另外 3 个变量进行比较,除非相应的字符串 (string1/string2/string3) 输入为空

思路是这样的:

如果它们都不为空,则:

if (o.s1.equals(string1) && o.s2.equals(string2) && o.s3.equals(string3))

如果 s1 是唯一一个空的,那么我们只比较其他 2 个:

if (o.s2.equals(string2) && o.s3.equals(string3))

所以如果输入的字符串为空,程序将不会检查该变量是否相等

有没有办法做到这一点,而不是一堆嵌套的 if 语句?我有 5 个变量,所以会有很多语句

对于更多的上下文,我想要做的是类似于搜索功能,其中有 3 个条件,如果所有 3 个字段都已填写,那么它将搜索满足所有 3 个条件的内容,但如果一个其中为空,则它只会查找满足其中两个条件的条目,如果 2 个为空,它将搜索仅满足一个条件的条目。

【问题讨论】:

  • 首先,不要使用==!= 比较字符串。请改用equals(...)equalsIgnoreCase(...) 方法。了解== 检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否以相同的顺序具有相同的字符,这就是这里的重点。
  • 接下来为什么不简单地做if (o.s1.isEmpty()) {或者在需要的地方反其道而行之?
  • 我看看是否有更简单的方法,我可以单独检查它们,但任意数量的字符串可能是空的,我的真实程序中有 5 个变量,所以每一个都做一个嵌套的 if else可能性似乎很多工作
  • 什么是空的? null? ""?

标签: java string if-statement


【解决方案1】:

如果“空”是指null,那么你可以做这样的事情......

if ((o.s1 == null || o.s1.equals(string1)) &&
    (o.s2 == null || o.s2.equals(string2)) &&
    (o.s3 == null || o.s3.equals(string3))) {
    // ...
}

【讨论】:

    【解决方案2】:

    你可以创建一个不管你有多少元素都可以工作的辅助函数:

    public static boolean areEqual(String[] objectElements, String[] userInputStrings){
           return IntStream.range(0, objectElements.length)
                           .allMatch(x -> userInputStrings[x].isEmpty() ||
                                       userInputStrings[x].equals(objectElements[x]));
    }
    

    然后这样称呼它:

    boolean result = areEqual(new String[]{o.s1,o.s2, o.s3,o.s4,o.s5 }, 
            new String[]{string1,string2,string3,string4,string5});
    

    【讨论】:

      【解决方案3】:

      我会为谓词检查添加一个简单的实用方法,仅在input 不为空时比较值:

      public static boolean nonBlankEquals(String input, String value) {
           return input == null || input.isEmpty() || input.equals(value);
      }
      

      因此,客户端代码将更具可读性,您无需在if 子句中复制变量;需要进行的比较越多,这将变得越来越重要。

      if (nonBlankEquals(string1, o.s1) 
              && nonBlankEquals(string2, o.s2) 
              && nonBlankEquals(string3, o.s3)
              && nonBlankEquals(string4, o.s4)
              && nonBlankEquals(string5, o.s5)) {
          // all inputs were blank or equal to corresponding values
      }
      

      【讨论】:

        猜你喜欢
        • 2018-03-09
        • 2016-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多