2012-05-14 42 views
6

我需要以下的代码逻辑串和剥空的:一起进行分离

这是三个字符串变量,

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语句读?我的意思是:你知道三元运算符,但是在级联中使用它并不清楚,那么谁会读你的代码就不那么清楚了。 –

+0

其他四种情况呢?它们也可能吗? – Alnitak

+0

是的,这是可能的。但是,我不会为此使用三元运算符。 – NPE

回答

1

你可以这样做:

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

See it

+0

+1因为这是聪明的做法,并且不用's1 =“A”','s2 =“B”'和's3 = null'讲授提问者 – oksayt

+0

,你会得到'A/B /'不正确。 –

+0

这是错的。分隔符需要以先前的结果为条件,这要求单独的语句/或后面的三元条件来检查所有以前的术语。 –

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

不会建议使用它!太难读了!

+0

我同意你的可读性。一旦你开始检查空字符串而不是'null',一旦你开始连接实际输入字符串而不是硬编码'“A/B”等,它会变得更难读。 – NPE

+1

我怀疑这是作业,我发现这似乎要求我们有时会生成无法读取的代码。 –

+0

刚刚编辑它!!!!! – WickeD

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(); 
} 

这是非常长于“内联”版本,但它可以工作,无论您想要加入的字符串的数量是多少(并且您可以将其更改为使用可变数量的参数)。它会使代码在哪里使用,比任何种类的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(); 
} 
+0

感谢您的回答。但不必要的'/'也应该删除每个场景。例如,如果s2为空,则输出应该是“A/C”而不是“A// C”。如果s1为空,则o/p应该是“B/C”而不是“/ B/C”。仍然需要太多的代码行吗? :) – Marshal

+0

@Marshal是的,更新了处理该问题的答案。是的,如果代码很长或者没有,但是如果它是可读的,可重用的并且不容易出错,那么更多的代码行却不是代码的99.9999%。无论如何,这不是为了回答你的问题,而是为字符串提供一个_join_函数的例子! :) –

+1

谢谢阿德里亚诺!这是我的预期。 – Marshal

10

您可以用番石榴类木和Apache Commons Lang中StringUtils.defaultIfBlank的帮助下做到这一点:

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

您可以提取的三条线“如果需要处理任意数量的字符串,则将“defaultIfBlank”转换为带有循环的方法。

+0

在第一次阅读时,我完全监视了“.skipNulls()”,这里是黄金。甚至还不知道它的存在。超级简单,用“可跳过”的东西:) – BAER

+0

如果你只想使用Guava库,或者使用Guava的'Strings.emptyToNull'而不是'defaultIfBlank'。 –

3

一个java8路与流

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