2011-11-08 49 views
4

我對Java很新,我偶然發現了以下問題。替代switch語句,當所有可能的情況下都知道?

我從一個txt文件中讀取電影列表,其中一個字段是電影被分類爲什麼類型的字符串表示,以及1-5的數字表示,表示電影已收到一個或多個獎項。

eks。一部電影在這個領域可能具有以下價值:「12bSt」 這意味着電影是b =傳記,S =體育,2 =獲得了學院獎。 ATM我這樣做:

String[] genreStringToArray(String genre) { 
    char[] genreCharArray = genre.toCharArray(); 
    this.genreArr = new String[genreCharArray.length]; 
    for (int i = 0; i < genreCharArray.length; i++) { 
     switch (genreCharArray[i]) { 
      case 'a': genreArr[i] = "Action";  break; 
      case 'A': genreArr[i] = "Animation";  break; 
      case 'b': genreArr[i] = "biographical";  break; 
      case 'c': genreArr[i] = "comedy";  break; 
      case 'C': genreArr[i] = "children";  break; 
      case 'd': genreArr[i] = "drama";  break; 
      case 'D': genreArr[i] = "documentary";  break; 
      case 'e': genreArr[i] = "epic";   break; 
           ..... etc 
      case 2:genreArr[i] = "Academy award";  break; 
      case 3:genreArr[i] = "Palme d`or";  break; 
      case 4:genreArr[i] = "Sight & sound";  break; 
      case 5:genreArr[i] = "AFI top 100";  break; 
     } 
    } 
    return genreArr; 
} 

我的問題是,什麼樣的實現會比這更有效?

+0

哈哈我想偷這張照片> _ < –

+0

乍一看,它看起來像你的代碼將起作用。有什麼問題? –

+1

@Shredder hehe :) pwnd。 – Jeger

回答

2

使用具有字符(或只是一個字符串)作爲關鍵字的字符串作爲值的映射。

Map<Character, String> genres = new HashMap<Character, String>() {{ 
    put('b', "biographical"); 
    put('C', "Children"); 
    put('2', "Academy Award"); 
    // etc... 
}}; 

String genre = "b2C"; 

List<String> info = new ArrayList<String>(); 
for (int i = 0; i < genre.length(); i++) { 
    info.add(genres.get(genre.charAt(i)); 
} 

System.out.println(StringUtils.join(info, ", ")); 

Outputs: biographical, Academy Award, Children 

本質上是一回事可以用enum s內完成,如果你需要傳遞周圍的信息,它可能是更好的做一個類型安全的方式。

+0

但OP要求更有效的東西,而不是更小的代碼...你確定* char * to * Character *(或創建一個* String *)加上* HashMap *查找的裝箱正在進行比lookupswitch或者tableswitch快嗎? *(注意,我不認爲OP真的需要「更快的代碼」,我只是指出,我不確定拳擊+地圖查找是否比桌面切換或lookupswitch快)* – TacticalCoder

+1

@ user988052這是「高效」的,而不是「有效」,雖然我混淆了我的實現。我從代碼維護,外觀和可讀性的角度來看它。 –

+0

啊啊:) OP寫道:*「我的問題是,什麼實現會比這更有效?」*然後他再次評論道:*「即時通訊尋找一種更有效的方法來解決這個問題,因爲有20萬部電影輸入「*。OP使用了兩次「有效」這個詞,暗示他是在表演後(提到有20K條目,好像很多)。我應該在「有效」之後使用[原文]來表明這是OP對這個詞的使用,而不是我的。這就是說我同意你寫的是更可讀的,我懷疑OP會有任何速度問題,只有20K電影:) – TacticalCoder

0

您可以先將它們全部放在HashMap中,然後直接訪問它。如果您需要更多訪問此映射,請執行此操作。如果你只是想檢查一次,你可以讓它像這樣(我建議你把它放在一個方法中)。

+0

這是一種方法,但錯誤的縮進^^ String [] genreStringToArray(String genre){ – Jeger

+0

啊,對不起,確定:P – leo

4

創建一個Map(一次),並查找值(仍然循環你的char數組)。

Map<Character, String> map= new HashMap<Character, String>(); 
.... 
    genreArr[i] = map.get(genreCharArray[i]); 
.... 

p.s.請注意,您在當前代碼中存在一個錯誤。 case 2:應該是case '2':

0

我認爲最好在這個實例中使用面向對象的編程,即創建一個代表你正在嘗試做什麼的對象。這裏是一個例子,不知道你的域名。

public class Film 
{ 
    private Genre genre; //Make this a List if necessary 
    private Award award; // Make this a List if necessary  
    //Other things that define a Film 
} 

public class Genre 
{ 
    enum GenreDefinition 
    { 
     ACTION("Action") //Add more as necessary 
    } 
    //Other things that define a genre 
} 

public class Award 
{ 
    enum AwardTypes 
    { 
     OSCAR("Oscar") //Add more as necessary 
    } 
    //Other things that define an award 
} 

現在,您可以將這些對象中的每一個存儲到任何您想要的結構中。現在,如果將這些值推入到Map或List中,則可以從這些結構中的任何一個的快速查找時間中受益。

-1

我會用這個數據庫表。

+0

@downvoter脫下來吧。請解釋。 – EJP

相關問題