使用分隔符连接字符串并去除空字符串。

7
我需要以下内容的代码逻辑:
这是三个字符串变量,
String s1 = "A"; String s2 = "B"; String s3 = "C";

我需要根据给定的情况产生以下输出:
  • 情况#1实际输出应为“A / B / C”
  • 情况#2当s1为空时,输出应为“B / C”
  • 情况#3当s2为空时,输出应为“A / C”
  • 情况#4当s3为空时,输出应为“A / B”
使用三元操作符是否可能实现这一点?

2
当然可以,但是你不觉得使用“普通”的if语句更容易阅读吗?我的意思是:你知道三元运算符,但如果在级联中使用它对你来说不清楚,那么对于阅读你的代码的人来说就更不清楚了。 - Adriano Repetti
其他四种情况呢?它们也可能发生吗? - Alnitak
是的,这是可能的。但是,我不会使用三元运算符来实现这个。 - NPE
我不想使用嵌套的if条件语句。我希望有一个两三行的解决方案。有什么想法吗?这就是为什么我问是否可以使用三元运算符来实现。 - IMJS
如果不会嵌套,只是级联(与答案中的代码进行比较,您认为三元运算符更清晰吗?)。您可以像在StringUtils中一样实现join方法(或使用它)。这将使代码易读、可重用且简短。 - Adriano Repetti
5个回答

10

使用Guava类Joiner和Apache Commons Lang StringUtils.defaultIfBlank的帮助,您可以实现它:

Joiner.on("/").skipNulls().join(
  defaultIfBlank(s1, null),
  defaultIfBlank(s2, null),
  defaultIfBlank(s3, null)
);

如果您需要处理任意数量的字符串,可以使用循环将 "defaultIfBlank" 的三行代码提取到一个方法中。


第一次阅读时,我完全忽略了这里的“.skipNulls()”,这是非常有用的。甚至还不知道它的存在。对于可跳过的内容来说,使用起来非常简单 :) - BAERUS
如果您只想使用Guava库,可以使用Guava的Strings.emptyToNull代替defaultIfBlank - Jacob van Lingen

3

使用Java8的Stream方式

Arrays.stream(new String[]{null, "", "word1", "", "word2", null, "word3", "", null})
    .filter(x -> x != null && x.length() > 0)
    .collect(Collectors.joining(" - "));

2

您可以做以下操作:

result = ((s1==null)?"":(s1+"/"))+((s2==null)?"":(s2+"/"))+((s3==null)?"":s3);

点击查看


使用s1 =“A”s2 =“B”s3 = null,您得到了不正确的A/B/ - Adrien Brunelat
这是错误的。分隔符需要根据先前的结果进行条件限制,这可能需要单独的语句或后面的三元条件来检查所有先前的条款。 - Thomas W

2

这不是一个真正的答案,因为我不会在这里使用三元运算符。

如果你需要连接字符串并删除空字符串,你可以编写一个通用函数(无错误检查,无优化,请将其视为示例):

public static String join(String[] array, char separator) {
    StringBuffer result = new StringBuffer();

    for (int i = 0; i < array.length; ++i) {
        if (array[i] != null && array[i].length() != 0) {
            if (result.length() > 0)
                result.append(separator);

            result.append(array[i]);
        }
    }

    return result.toString();
}

这个方法比“inline”版本要长,但无论您想要连接多少个字符串,它都可以工作(而且您可以将其更改为使用可变数量的参数)。它将使您在使用它的代码中比任何类型的if语句树更清晰。

像这样:

public static String join(char separator, String... items, ) {
    StringBuffer result = new StringBuffer();

    for (String item: items) {
        if (item != null && item.length() != 0) {
            if (result.length() > 0)
                result.append(separator);

            result.append(item);
        }
    }

    return result.toString();
}

谢谢你的回答。但是每种情况下都应该删除不需要的'/'。例如,如果s2为空,则输出应为"A / C"而不是"A // C"。对于另一种情况,如果s1为空,则输出应为"B / C"而不是"/ B / C"。还需要太多行代码吗? :) - IMJS
@Marshal 是的,已经更新了答案来处理这个问题。是的,代码行数更多了,但99.9999%的情况下,重点不在于代码是否长而在于它是否可读、可重用和不容易出错。无论如何,这并不是为了回答你的问题,而是为了提供一个字符串_join_函数的示例! :) - Adriano Repetti

0
String ans = (s1 == null ? s2 + "/" + s3 : (s2 == null ? s1 + "/" + s3 : (s3 == null ? s1 + "/" + s2 : s1 + "/"+ s2 + "/" + s3 )));

虽然不建议使用它!但是太难读了!


我同意你关于可读性的看法。一旦你开始检查空字符串而不是null,并且开始连接实际输入字符串而不是硬编码的“ A / B”等,它将变得更加难以阅读。 - NPE
1
我怀疑这是一份作业,而有时候我们需要编写难以阅读的代码。 - Drew Gibson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接