2012-05-14 81 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(" - "));