2016-03-11 73 views
3

我想知道在switch case情況下是否可以使用諸如'contains()'之類的方法。我正在嘗試將以下if語句放入開關盒中:在switch case語句中使用方法

String sentence; 
if(sentence.contains("abcd")){ 
// do command a 
} 
else if(sentence.contains("efgh")){ 
// do command b 
} 
else if(sentence.contains("ijkl")){ 
// do command c 
} 
else{ 
//do command d 
} 

非常感謝您的幫助。

+4

不,你不能。 'if'不能被'switch'完全替換。 – khelwood

回答

1

其實你可以,如果改變這種進開關,但它有點不可讀:

final String sentence; 
    int mask = sentence.contains("abcd") ? 1 : 0; 
    mask |= sentence.contains("efgh") ? 2 : 0; 
    mask |= sentence.contains("ijkl") ? 4 : 0; 
    switch (mask) { 
    case 1: 
    case 1 | 2: 
    case 1 | 4: 
    case 1 | 2 | 4: 
     // do command a 
     break; 
    case 2: 
    case 2 | 4: 
     // do command b 
     break; 
    case 4: 
     // do command c 
     break; 
    default: 
     // do command d 
    } 
} 
+0

非常感謝,它完美的工作!但是,請你解釋一下這種方法的工作原理嗎?我將非常感激。 – Flissie

+0

@Flissie它使用位掩碼來確定發現了什麼子字符串,所以如果第一位被設置 - 這意味着abcd被找到,但只要其他子字符串也可以被提交 - 你需要幾個case語句來處理任何可能的位掩碼 –

-1

不,你不能。 case語句只能比較被「切換」的東西的值。事實上,最近'java'開始支持Strings上的switch語句,因爲它們是對象而不是原始的。一般來說,switch語句只能用於原語。唯一的例外是,儘可能IM知道,是絃樂

+2

你也可以打開枚舉,這也不是原語。 – khelwood

0

是的,假設您使用的是JDK 7或更高版本,您可以使用switch語句獲得相當的代碼位數。 JDK 7 introduced the ability to allow String objects as the expression in a switch statement。與調用等於方法的if-then-else語句鏈相比,這通常產生更高效的字節碼。

String pattern; 
String sentence; 

if (sentence.contains(pattern)) 
{ 
    switch (pattern) 
    { 
     case "abcd": 

      // do command a 
      break; 

     case "efgh": 

      // do command b 
      break; 

     case "ijkl": 

      // do command c 
      break; 

     default: 

      // do command d 
      break; 
    } 
} 

確實注意到然而,這只是工作,因爲該包含方法需要字符串對象,字符串對象現在switch語句內有效。你不能概括這個與任意類型的對象一起工作。

+1

This似乎沒有與OP的代碼具有相同的行爲,除非您先驗知道哪種模式匹配。 –

+0

@AndyThomas OP有先驗知識模式匹配;他在編譯時對代碼中的模式進行了硬編碼,並且在運行時明確提供了某種形式的輸入。因此,我的答案片段重新創建了OP代碼的行爲。 – Dyndrilliac

+0

OP的代碼顯示了可能的匹配組的先進知識。它使用它來找到第一個匹配模式。如果事先知道匹配模式,那麼就不需要用'if'或'switch'來找到它。 –

相關問題