Ответ 1
Я тоже не сделаю этого:
String[] out = {
"1st Quarter",
"2nd Quarter",
"3rd Quarter",
"4th Quarter"
};
if (1 <= day && day <= 12) {
System.out.println(out[(day - 1) / 3]);
} else {
System.out.println("Error!");
}
Возможный дубликат:
If/Else vs. Switch
У меня есть два кода здесь, я просто хотел спросить, какая из них лучше с точки зрения возможности записи (простота написания кодов) и с точки зрения удобочитаемости (простота понимания кодов).
включение случай:
import java.io.*;
public class Quarter{
public static void main(String[] args){
int day;
String input="";
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Input a number from 1 to 3: ");
try{
input=in.readLine();
}catch(IOException e){
System.out.println("Error!");
}
day=Integer.parseInt(input);
switch(day){
case 1:
case 2:
case 3:
System.out.println("1st Quarter");
break;
case 4:
case 5:
case 6:
System.out.println("2nd Quarter");
break;
case 7:
case 8:
case 9:
System.out.println("3rd Quarter");
break;
case 10:
case 11:
case 12:
System.out.println("4th Quarter");
break;
default: System.out.println("Error!");
}
}
}
если-то еще:
import java.io.*;
public class Days{
public static void main(String[] args){
int day;
String input="";
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Input a number from 1 to 12: ");
try{
input=in.readLine();
}catch(IOException e){
System.out.println("Error!");
}
day=Integer.parseInt(input);
if(day>=1 && day<=3){
System.out.println("1st Quarter");
}else
if(day>=4 && day<=6){
System.out.println("2nd Quarter");
}else
if(day>=7 && day<=9){
System.out.println("3rd Quarter");
}else
if(day>=10 && day<=12){
System.out.println("4th Quarter");
}else
System.out.println("Error!");
}
}
Я тоже не сделаю этого:
String[] out = {
"1st Quarter",
"2nd Quarter",
"3rd Quarter",
"4th Quarter"
};
if (1 <= day && day <= 12) {
System.out.println(out[(day - 1) / 3]);
} else {
System.out.println("Error!");
}
Какой из них вы бы предпочли? Это ваш код.
Я определенно предпочитаю коммутатор, но если у вас есть что-то комбинированное или, например, "больше, чем" коммутатор "- это неправильный способ сделать это.
Другое дело: я бы написал случай с переключателем, как показано ниже, потому что я думаю, что лучше читать:
switch(day){
case 1:
case 2:
case 3:
System.out.println("1st Quarter");
break;
...
}
HTH, Андреас
Избегайте необходимости в ветки логики в первую очередь. Поиск таблицы часто является полезным методом. Арифметическая манипуляция также важна - найдите шаблон в значениях, которые вам нужны, и функцию, которая превращает их в нечто более простое. Также рассмотрите полиморфизм в более сложных случаях.
Если вы обрабатываете все исключения одинаково, то делайте это в одном и том же месте.
Скопируйте переменные по мере возможности.
Запрос на ввод, который вы действительно хотите, FFS.:)
import java.io.*;
public class Quarter {
public static void main(String[] args) {
try {
System.out.print("Input the month number (1 = January, 2 = February ... 12 = December): ");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int month = Integer.parseInt(in.readLine());
int quarter = (month - 1) / 3;
String[] quarters = new String[]{ "1st", "2nd", "3rd", "4th" };
System.out.println(quarters[quarter] + " Quarter");
} catch (Exception e) { // IOException for non-numeric, or AIOOBE for out of range
System.out.println("Error!");
}
}
}
Как насчет:
(day>=1 && day <=3) ? System.out.println("1st Quarter") :
(day >= 4 && day <= 6) ? System.out.println("2nd Quarter") :
(day >=7 && day <= 9) ? System.out.println("3rd Quarter") :
(day >= 10 && day <= 12) ? System.out.println("4th Quarter") : System.out.println("Error1");
;)
Вы также можете сделать это:
String val = (day>=1 && day <=3) ? "1st Quarter" :
(day >= 4 && day <= 6) ? "2nd Quarter" :
(day >=7 && day <= 9) ? "3rd Quarter" :
(day >= 10 && day <= 12) ? "4th Quarter" : "Error1";
System.out.println(val);
Я думаю, что оба должны работать.
Мне непонятно, возникает ли вопрос о решениях конкретного примера кода или о структуре вообще. Итак, некоторые достоинства подхода if-else для рассмотрения.
if-else чаще всего используется в коде, так как число типы данных, принятые коммутатором, ограничены, а сам переключатель ограничен для компиляции значений времени. Более знакомы лучше для удобочитаемости для более широкой аудитории.
Фундаментальная структура не меняется, если вы найдете изменения требований, и вам необходимо поддерживать другой тип данных. Мне пришлось изменить множество переключателей на перечислениях для сравнения строк в мое время, когда кто-то добавил требование, чтобы пользователи могли настройте параметры.
Необходимость использования break; правильно внутри коммутаторов вводит возможности для нечетных ошибок, которые появляются только в переключатели становятся большими и сложными.
Конечно, лично являясь программистом на предприятии, я бы создал timeUnitSubDivisionResolvingVisitor...:)
String[] suffix = new String[]{ "st", "nd", "rd", "th" };
System.out.println((1 <= day && day <= 12)?
String.format("%d%s Quarter", (day-1)/3+1, suffix[(day-1)/3]):
"Error!"
);
просто альтернативный способ его реализации через карту. Это сделает его настраиваемым, особенно если вы используете Spring, где вы можете настроить эту конфигурацию карты в своем bean.xml, если вы решите.
В любом случае вот альтернатива:
Map<Integer, String> m = new HashMap<Integer, String>();
m.put(1, "1st Quarter");
m.put(2, "1st Quarter");
m.put(3, "1st Quarter");
m.put(4, "2nd Quarter");
m.put(5, "2nd Quarter");
m.put(6, "2nd Quarter");
m.put(7, "3rd Quarter");
m.put(8, "3rd Quarter");
m.put(9, "3rd Quarter");
m.put(10, "4th Quarter");
m.put(11, "4th Quarter");
m.put(12, "4th Quarter");
System.out.println(m.get(d));