Использовать строку в корпусе переключателя в java
Мне нужно изменить следующее, if
это нужно для проверки String
, чтобы улучшить циклическую сложность.
String value = some methodx; if ("apple".equals(value)) { method1; } if ("carrot".equals(value)) { method2; } if ("mango".equals(value)) { method3; } if ("orange".equals(value)) { method4; }
Но я не уверен, какую ценность я получу.
- Использование NSString в операторе switch
- Как выбрать диапазон значений в инструкции switch?
- Ограничения оператора C # - почему?
- Если против скорости переключения
- Как отчет о работе коммутатора Реализован или работает внутри страны?
- Почему переключатель для enums принимает неявное преобразование в 0, но нет для какого-либо другого целого?
- Должны ли команды switch всегда содержать предложение по умолчанию?
- Тест для нескольких случаев в коммутаторе, например, OR (||)
- Почему Java-переключатель на непрерывных ints работает быстрее с добавленными случаями?
- Контроль не может провалиться с одного ярлыка случая
- Корпус переключателя типа c #
- «Else if» быстрее, чем «switch () case»?
- Как сделать заявление оператора C # использовать IgnoreCase
Java (до версии 7) не поддерживает String в switch / case. Но вы можете достичь желаемого результата, используя перечисление.
private enum Fruit { apple, carrot, mango, orange; } String value; // assume input Fruit fruit = Fruit.valueOf(value); // surround with try/catch switch(fruit) { case apple: method1; break; case carrot: method2; break; // etc... }
Научитесь использовать else
.
Поскольку value
никогда не будет равно двум неравным строкам сразу, есть только 5 возможных результатов: по одному для каждого значения, которое вам нужно, плюс один для «ни одного из вышеперечисленных». Но поскольку ваш код не устраняет те тесты, которые не могут пройти, он имеет 16 «возможных» путей (2 ^ число тестов), из которых большинство никогда не будет соблюдаться.
В else
случае единственными путями, которые существуют, являются 5, которые действительно могут произойти.
String value = some methodx; if ("apple".equals(value )) { method1; } else if ("carrot".equals(value )) { method2; } else if ("mango".equals(value )) { method3; } else if ("orance".equals(value )) { method4; }
Или начните использовать JDK 7, который включает в себя возможность использования строк в инструкции switch
. Конечно, Java будет просто компилировать этот switch
в конструкцию if
/ else
так или иначе …
Сегодня все используют Java 7 , верно? Вот ответ на исходную проблему:
String myString = getFruitString(); switch (myString) { case "apple": method1(); break; case "carrot": method2(); break; case "mango": method3(); break; case "orange": method4(); break; }
Заметки
- Операторы case эквивалентны использованию
String.equals
. - Как обычно, соответствие строк зависит от регистра.
- Согласно документам , это, как правило, быстрее, чем использование прикованных операторов
if
else
(как в ответе cHao ).
Чтобы уменьшить циклическую сложность, используйте карту:
Map> map = new HashMap < > ( ) ; map . put ( "apple" , new Callable
или polymorphism
Чтобы ответить на конкретный вопрос, исполняемый код выглядит следующим образом:
Map> map = new HashMap>(); map.put( "test" , new Callable () { public User call (){ return fillUser("test" ); }} ) ; map.put( "admin" , new Callable () { public Utente call (){ return fillUser("admin" ); }} ) ;
где пользователь является POJO, а затем
User user = map.get(USERNAME).call();
наконец, вызываемый метод находится где-то:
private User fillUser(String x){ User user = new User(); // set something in User return user; }
Java не поддерживает Switch-case со String. Думаю, эта ссылка может вам помочь. 🙂
Вот возможный способ до 1.7, который я не могу рекомендовать:
public class PoorSwitch { final static public int poorHash (String s) { long l = 0L; for (char c: s.toCharArray ()) { l = 97*l + c; } return (int) l; } public static void main (String args[]) { String param = "foo"; if (args.length == 1) { param = args[0]; } // uncomment these lines, to evaluate your hash // test ("foo"); // test ("bar"); switch (poorHash (param)) { // this doesn't work, since you need a literal constant // so we have to evaluate our hash beforehand: // case poorHash ("foo"): { case 970596: { System.out.println ("Foo!"); break; } // case poorHash ("bar"): { case 931605: { System.out.println ("Bar!"); break; } default: { System.out.println ("unknown\t" + param); break; } } } public static void test (String s) { System.out.println ("Hash:\t " + s + " =\t" + poorHash (s)); } }
Возможно, вы могли бы работать с таким трюком в сгенерированном коде. Иначе я не могу это порекомендовать. Не так много, что возможность столкновения hashей заставляет меня беспокоиться, но если что-то перепутано (вырезать и вставить), трудно найти ошибку. 931605 не является хорошей документацией.
Возьмите его как доказательство концепции, как любопытство.
Мы можем применять Switch только по типу данных, совместимым с int: short, Shor, byte, Byte, int, Integer, char, Character или enum type.
Оценка переменных String
с помощью оператора switch реализована в Java SE 7 , и, следовательно, она работает только в java 7. Вы также можете посмотреть, как эта новая функция реализована в JDK 7.
Java 8 поддерживает строковый коммутатор.
String type = "apple"; switch(type){ case "apple": //statements break; default: //statements break; }
String name,lname; name= JOptionPane.showInputDialog(null,"Enter your name"); lname= JOptionPane.showInputDialog(null,"Enter your father name"); if(name.equals("Ahmad")){ JOptionPane.showMessageDialog(null,"welcome "+name); } if(lname.equals("Khan")) JOptionPane.showMessageDialog(null,"Name : "+name +"\nLast name :"+lname ); else { JOptionPane.showMessageDialog(null,"try again " ); } }}
Не очень красиво, но вот еще один способ:
String runFct = queryType.equals("eq") ? "method1": queryType.equals("L_L")? "method2": queryType.equals("L_R")? "method3": queryType.equals("L_LR")? "method4": "method5"; Method m = this.getClass().getMethod(runFct); m.invoke(this);
String value = someMethod(); switch(0) { default: if ("apple".equals(value)) { method1(); break; } if ("carrot".equals(value)) { method2(); break; } if ("mango".equals(value)) { method3(); break; } if ("orance".equals(value)) { method4(); break; } }