как исправить код(for,switch)
Приведенным данным
MARKS 3 5 2 3 4 4 3 4
должен соответствовать вывод
Satisfactory
Excellent
Unsatisfactory
Satisfactory
Good
Good
Satisfactory
Good
У меня так получилось, но если ввести еще одни данные, то не работает правильно. На входе:
MARKS 3 5 2 3 4 4 PLANETS 1 4 5 1
На выходе:
Satisfactory
Excellent
Unsatisfactory
Satisfactory
Good
Good
Unsatisfactory
Good
Excellent
Unsatisfactory
Mercury
Mars
Jupiter
Mercury
Исходный код решения:
public static void main(String[] args) {
for(int i=0;i<args.length;i++) {
if(args[i].equals("WEEK_DAYS")) {
for (int j = i+1; j < args.length; j++) {
switch(args[j]) {
case "1":
System.out.println("Monday");
break;
case "2":
System.out.println("Tuesday");
break;
case "3":
System.out.println("Wednesday");
break;
case "4":
System.out.println("Thursday");
break;
case "5":
System.out.println("Friday");
break;
case "6":
System.out.println("Saturday");
break;
case "7":
System.out.println("Sunday");
break;
default:
System.out.println();
}
}
}else if(args[i].equals("MARKS")) {
for (int j = i+1; j < args.length; j++) {
switch(args[j]) {
case "0":
case "1":
case "2":
System.out.println("Unsatisfactory");
break;
case "3":
System.out.println("Satisfactory");
break;
case "4":
System.out.println("Good");
break;
case "5":
System.out.println("Excellent");
break;
default:
System.out.println();
}
}
}else if(args[i].equals("PLANETS")) {
for (int j = i+1; j < args.length; j++) {
switch(args[j]) {
case "1":
System.out.println("Mercury");
break;
case "2":
System.out.println("Venus");
break;
case "3":
System.out.println("Earth");
break;
case "4":
System.out.println("Mars");
break;
case "5":
System.out.println("Jupiter");
break;
case "6":
System.out.println("Saturn");
break;
case "7":
System.out.println("Uran");
break;
case "8":
System.out.println("Neptune");
break;
default:
System.out.println();
}
}
}
}
}
Ответы (2 шт):
Автор решения: vasilpetrovich
→ Ссылка
я сделал, но насколько он оптимизирован
for(int i=0;i<args.length;i++) {
if(args[i].equals("WEEK_DAYS")) {
for (int j = i+1; j < args.length; j++) {
if(args[j].equals("MARKS") || args[j].equals("PLANETS") || args[j].equals("WEEK_DAYS")) {
System.out.println();
break;
};
switch(args[j]) {
case "1":
System.out.println("Monday");
break;
case "2":
System.out.println("Tuesday");
break;
case "3":
System.out.println("Wednesday");
break;
case "4":
System.out.println("Thursday");
break;
case "5":
System.out.println("Friday");
break;
case "6":
System.out.println("Saturday");
break;
case "7":
System.out.println("Sunday");
break;
}
}
}else if(args[i].equals("MARKS")) {
for (int j = i+1; j < args.length; j++) {
if(args[j].equals("PLANETS") || args[j].equals("WEEK_DAYS") || args[j].equals("MARKS")) {
System.out.println();
break;
};
switch(args[j]) {
case "0":
case "1":
case "2":
System.out.println("Unsatisfactory");
break;
case "3":
System.out.println("Satisfactory");
break;
case "4":
System.out.println("Good");
break;
case "5":
System.out.println("Excellent");
break;
}
}
}else if(args[i].equals("PLANETS")) {
for (int j = i+1; j < args.length; j++) {
if(args[j].equals("MARKS") || args[j].equals("WEEK_DAYS") || args[j].equals("PLANETS")) {
System.out.println();
break;
};
switch(args[j]) {
case "1":
System.out.println("Mercury");
break;
case "2":
System.out.println("Venus");
break;
case "3":
System.out.println("Earth");
break;
case "4":
System.out.println("Mars");
break;
case "5":
System.out.println("Jupiter");
break;
case "6":
System.out.println("Saturn");
break;
case "7":
System.out.println("Uran");
break;
case "8":
System.out.println("Neptune");
break;
}
}
}
}
Автор решения: Дмитрий
→ Ссылка
Решение на вложенных в двойные циклы свичи с условными операторами и все это в одном методе? Уже на этом этапе это нечитаемый код даже с учетом его несложной логики. Я бы в этом случае смотрел на энамы (альтернатива - коллекции типа ключ-значение). Можно примерно так (рефакторинг за вами):
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
String [] arg = "MARKS 3 5 2 3 4 4 PLANETS 1 4 5 1".split(" ");
Executor executor = new Executor();
String result = Stream.of(arg).map(executor::getValue).collect(Collectors.joining(" "));
System.out.println(result);
}
}
import java.time.DayOfWeek;
import java.time.format.TextStyle;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
public class Executor {
private final Map<String, Function<Integer, String>> resolver;
private Function<Integer, String> function;
public Executor() {
resolver = new HashMap<>(3);
resolver.put("MARKS", value -> Mark.values()[Math.max(0, value-2)].getName());
resolver.put("PLANETS", value -> Planet.values()[value - 1].getName());
resolver.put("WEEK_DAYS", value -> DayOfWeek.of(value).getDisplayName(TextStyle.FULL, Locale.ENGLISH));
}
public String getValue(String arg) {
Optional.ofNullable(resolver.get(arg)).ifPresent(function->this.function = function);
try {
return function.apply(Integer.valueOf(arg));
} catch (Exception e) {
return "";
}
}
}
public enum Planet {
MERCURY("Mercury"),
VENUS("Venus"),
EARTH("Earth"),
MARS("Mars"),
JUPITER("Jupiter"),
SATURN("Saturn"),
URAN("Uran"),
NEPTUNE("Neptune");
private final String name;
private Planet(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public enum Mark {
UNSATISFACTORY("Unsatisfactory"),
SATISFACTORY("Satisfactory"),
GOOD("Good"),
EXCELLENT("Excellent");
private final String name;
private Mark(String name) {
this.name = name;
}
public String getName() {
return name;
}
}