2013-09-06 4 views
0

Мне нужно проверить небольшую логику и было бы очень признательно, если кто-то может дать мне ценный ввод.if else или switch case

У меня есть два способа проверить мою логику и узнать, что является более эффективным.

первый путь:

if(url.equalsIgnoreCase("1")){ 
    url = "aaa"; 
} 
else if(url.equalsIgnoreCase("2")){ 
    url = "bbb"; 
} 
else if(url.equalsIgnoreCase("3")){ 
    url = "ccc"; 
} 
else if(url.equalsIgnoreCase("4")){ 
    url = "ddd"; 
} 
else if(url.equalsIgnoreCase("5")){ 
    url = "eee"; 
} 
else if(url.equalsIgnoreCase("6")){ 
    url = "fff"; 
} 

второй путь:

int temp = Integer.parseInt(url); 
switch (temp) { 
case 1: 
    url = "aaa"; 
    break; 
case 2: 
    url = "bbb"; 
    break; 
case 3: 
    url = "ccc"; 
    break; 
case 4: 
    url = "ddd"; 
    break; 
case 5: 
    url = "eee"; 
    break; 
case 6: 
    url = "fff"; 
    break; 
} 

Пожалуйста, дайте мне знать, что является более эффективным. Плохо ли использовать Integer.parseInt(string)?

+1

Почему «equalsIgnoreCase» для сравнения целых чисел? –

+0

@ micro.pravi .. его частично дубликат вашей предлагаемой ссылки. В основном я хотел знать, добавит ли Interger.parseInt(), что сделает его более эффективным или нет. Только я опубликовал новый вопрос .. – Sushil

ответ

25

Если ваши ценности на самом деле 1-6, наиболее ясным и наиболее эффективным способом является использование массива:

String[] URLS = {...}; 
url = URLS[Integer.parseInt(url) - 1]; 
+9

+1 для мышления из коробки :) –

+2

я должен признать: гладко ... но это не совсем отвечает на его вопросы (все еще +1) –

+1

Большинство ответов верны, но это действительно из коробки мышления :) – Sushil

2

Как правило, оператор switch производит более эффективные bytecode. С Java 7 были введены операторы switch с String, поэтому вам не нужно их бросать.

12

Пожалуйста, дайте мне знать, что более эффективно.

переключатель заявление является более эффективным, ваш случай

Это плохо использовать Integer.parseInt (строка)?

Нет. Все в порядке. но когда вы используете java7, вы можете использовать значения String-константы в ваших случаях переключения, но не на Android.

Учитывайте эффективность: в большинстве случаев переключатель выглядит чище.

+0

(но java 7 еще не включен на Android) – njzk2

+0

@ njzk2 Tagged java :) –

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ: но тоже помечен android :) – njzk2

1

для такого длинного списка является заявлением switch определенно лучшим выбором. Чем длиннее соединение, тем лучше отрезать выключатель в сравнении

2

В этом случае switch более эффективен.

Фактически, если вы используете Java7, вы можете напрямую использовать строковый регистр, а не использовать Integer.parseInt().

2

Неплохо использовать parseInt, но он будет генерировать исключение, если строка не является целым числом.

В противном случае, и я думаю, вы можете это увидеть сами, переключатель/корпус гораздо читабельнее.

если ваш, если конструкция будет иметь окончательный еще поймать всех остальных случаях (в том числе не числовых строк)

, то вы можете сделать, предполагая, что ваши Интс всегда положительны

int temp = -1; 
try { 
    temp = Integer.parseInt(str); 
} catch (NumberFormatException ex) { 
    // ignore exception and use -1 as original value for default case 
} 
1

Эффективность зависит от условий согласования в обоих случаях.Пожалуйста, ответьте на ваш вопрос here.

2

Читаемость и отладочность (это даже слово?) Довольно субъективны, но некоторые люди (включая меня) находят заявление switch более понятным. Однако во многих случаях у компилятора больше шансов получить более быстрый код с использованием switch по сравнению с конструкцией if else.

1

Я думаю, что альтернативным подходом было бы использовать предварительно инициализированную карту. Он должен иметь (строковые) числа в качестве ключа, а URL-адрес - как значение. Тогда вы можете просто сделать

url = map.get(Integer.parseInt(url)); 

Это, вероятно, даже более чистая версия, чем инструкция длинного переключателя.

1

Коммутатор имеет больше возможностей, чем если бы это было иначе, потому что вы можете проваливать случаи.

Смотрите подробности: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

class SwitchDemo2 { 
    public static void main(String[] args) { 

     int month = 2; 
     int year = 2000; 
     int numDays = 0; 

     switch (month) { 
      case 1: case 3: case 5: 
      case 7: case 8: case 10: 
      case 12: 
       numDays = 31; 
       break; 
      case 4: case 6: 
      case 9: case 11: 
       numDays = 30; 
       break; 
      case 2: 
       if (((year % 4 == 0) && 
        !(year % 100 == 0)) 
        || (year % 400 == 0)) 
        numDays = 29; 
       else 
        numDays = 28; 
       break; 
      default: 
       System.out.println("Invalid month."); 
       break; 
     } 
     System.out.println("Number of Days = " 
          + numDays); 
    } 
} 

выведет

Number of Days = 29 

Так это также зависит от ваших требований к реализации которых один используется.

2

Оператор switch работает быстрее по двум причинам.

  1. Оператор switch обычно быстрее, чем if-else-if, потому что элемент управления напрямую передается в соответствующий регистр. Если в случаях if-else-if все проверки будут выполнены для достижения первого условия согласования. Например, если вы назначаете temp = 6, оператор switch будет выполнять соответствующий блок напрямую. Конструкция if-else-if будет проходить через все условия.

  2. Вызов equalsIgnoreCase() является более дорогостоящим, чем выполнение проверки равенства, которая происходит на фоне соответствия случая.

Смежные вопросы