2012-02-24 32 views
1

我有下面的代碼,我寫了擺脫如果然後其他語句巨大的混亂。唯一的問題是,我發現Switch語句不能與字符串一起使用。如何使用字符串切換

有沒有竅門來解決這個問題?

感謝

switch(xpp.getName()) { 
      case("creature") : attribID = Integer.parseInt(xpp.getAttributeValue(0)); 
      case("name") : elName = xpp.getName(); break; 
      case("race") : elName = xpp.getName(); break; 
      case("gender") : elName = xpp.getName(); break; 
      case("alignment") : elName = xpp.getName(); break; 
      case("age") : elName = xpp.getName(); break; 
      case("condition") : elName = xpp.getName(); break; 
      case("skinColor") : elName = xpp.getName(); break; 
      case("hairColor") : elName = xpp.getName(); break; 
      case("size") : elName = xpp.getName(); break; 
      case("height") : elName = xpp.getName(); break; 
      case("weight") : elName = xpp.getName(); break; 
      case("hitPoints") : elName = xpp.getName(); break; 
      case("armorClass") : elName = xpp.getName(); break; 
      case("actionPoints") : elName = xpp.getName(); break; 
      case("magicPoints") : elName = xpp.getName(); break; 
      case("strength") : elName = xpp.getName(); break; 
      case("dexterity") : elName = xpp.getName(); break; 
      case("intelligence") : elName = xpp.getName(); break; 
      case("weapon") : elName = xpp.getName(); break; 
      case("armor") : elName = xpp.getName(); break; 
      case("magicItem") : elName = xpp.getName(); break; 
      case("attackSpell") : elName = xpp.getName(); break; 
      case("defenseSpell") : elName = xpp.getName(); break; 
      case("item1") : elName = xpp.getName(); break; 
      case("item2") : elName = xpp.getName(); break; 
     } 
+1

是的,使用支持切換字符串的JDK(即Java 7)。 – mre 2012-02-24 18:20:42

+2

重複 - http://stackoverflow.com/questions/338206/switch-statement-with-strings-in-java – 2012-02-24 18:21:42

+5

這僅僅是一個虛擬的代碼嗎?如果不是這樣的話,這個案例看起來很荒謬。上面看起來應該是一個單獨的if-else語句。 – 2012-02-24 18:26:08

回答

2

你正在做同樣的事情,對於所有的情況exept然後xpp.getName()是「生物」。這意味着,所有的代碼可以很容易地轉化爲辛格運河if語句

if (xpp.getName().equal("creature")) 
    attribID = Integer.parseInt(xpp.getAttributeValue(0)); 
else 
    elName = xpp.getName(); 

它也像你應該開始編程更加面向對象,並創建一些類,而不是使用一個名稱來確定對象是什麼

1

開關字符串僅適用於Java 7中所以你需要使用Java 7 SDK編譯代碼。

不過,如果你使用的是Eclipse作爲開發Android應用程序,您將無法設置密碼合規水平的Java 7的Android項目的IDE。然後,您將不得不等待Android的鄉親支持Java 7或選擇使用的IntelliJ或與Java 7 SDK編譯的命令行代碼,然後使用DEX編譯器...

2

Java 7的支持打開字符串,但它不適用於android。

我推薦使用枚舉。創建一個枚舉類並將其命名爲期望的字符串。然後,您可以確定給定字符串的枚舉並打開它。

下面是一個例子:

Number.java

public enum Number { one, two, three } 

Switcher.java

public class Switcher { 
    public static void main(String[] args) { 
     String input = "one"; 
     switch (Number.valueOf(input)) { // <- that's the magic! 
     case one:System.out.println("1");break; 
     case two:System.out.println("2");break; 
     case three:System.out.println("3");break; 
     } 
    } 
} 
3

作爲替代方案,如果你不能只是切換到Java 7 ,最簡單的方法是用一堆if else來代替switch語句。或者,您可以嘗試切換字符串的hashCode,但我只建議如果您確定沒有碰撞(hashCode()不能保證可以防止碰撞!)。最明確和最簡單的解決方案將使用if else's。它保持可讀性,並允許您仍然支持舊版本的Java。

編輯:只用一種情況做不同的東西!爲什麼不簡單地做:

if (xpp.getName().equals("creature") { 
    attribID = Integer.parseInt(xpp.getAttributeValue(0)); 
} else { 
    elname = xpp.getName(); 
} 
2

重新思考你的設計。使其更加面向對象。使用匿名類,也許,或某種調度表。或者只是簡化它。看起來反正只有2個選擇(「生物」做一件事,另一件事做另一件事)。難以維護的代碼是重構的主要候選者。

相關問題