Альтернатива переключению оператора, когда известны все возможные случаи? - PullRequest
4 голосов
/ 08 ноября 2011

Я совершенно новичок в Java, и я наткнулся на следующую проблему.

Я читаю список фильмов из текстового файла, одно из полей является строковым представлением того, какой жанр фильмаклассифицируется как, а также числовое представление 1-5, означающее, что фильм получил одну или несколько наград.

eks.один фильм может иметь следующее значение в этом поле «12bSt», это будет означать, что фильм ab = биографический, S = спортивный, 2 = выиграл академическую награду.атм я делаю это:

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

мой вопрос, какая реализация будет более эффективной, чем эта?

Ответы [ 5 ]

4 голосов
/ 08 ноября 2011

Создайте карту (один раз) и найдите значения (по-прежнему просматривая массив символов).

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

p.s. Имейте в виду, что в вашем текущем коде есть ошибка. case 2: должно быть case '2':.

2 голосов
/ 08 ноября 2011

Используйте карту с символом (или просто строкой) в качестве ключа, строку в качестве значения.

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 голосов
/ 09 ноября 2011

Я бы использовал для этого таблицу базы данных.

0 голосов
/ 09 ноября 2011

Я думаю, что лучше всего использовать объектно-ориентированное программирование в этом случае, то есть создать объект, который представляет то, что вы пытаетесь сделать.Вот пример, не зная вашего домена.

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  
} 

Теперь вы можете хранить каждый из этих объектов в любой структуре, какую захотите.Теперь, если вы поместите эти значения в карту или список, вы сможете воспользоваться преимуществами быстрого поиска любой из этих структур.

0 голосов
/ 08 ноября 2011

Вы можете сначала поместить их все в HashMap, а затем просто получить к ним доступ.Сделайте это, если вам нужно больше доступа к этому отображению.Если вы просто захотите проверить это один раз, вы можете разрешить это так (я бы посоветовал вам поместить это в метод).

...