Как уменьшить количество if до 3? Не использовать switch case
Задача показать минимальное и максимальное значение основываясь на том какое слово запишут в args[].Если ничего не передали вывести значения всех примитивных типов.Если написали что-то некорректное вывести "Error"
public static void main(String[] args) {
for(int i=0;i<args.length;i++) {
if(args[i].equals("byte")) {
System.out.println("Min Value="+Byte.MIN_VALUE+"\nMax Value="+Byte.MAX_VALUE);
}
else if(args[i].equals("short")) {
System.out.println("Min Value="+Short.MIN_VALUE+"\nMax Value="+Short.MAX_VALUE);
}
else if(args[i].equals("int")) {
System.out.println("Min Value="+Integer.MIN_VALUE+"\nMax Value="+Integer.MAX_VALUE);
}
else if(args[i].equals("long")) {
System.out.println("Min Value="+Long.MIN_VALUE+"\nMax Value="+Long.MAX_VALUE);
}
else if(args[i].equals("float")) {
System.out.println("Min Value="+Float.MIN_VALUE+"\nMax Value="+Float.MAX_VALUE);
}
else if(args[i].equals("double")) {
System.out.println("Min Value="+Double.MIN_VALUE+"\nMax Value="+Double.MAX_VALUE);
}
else if(args[i].equals("char")) {
System.out.println("Min Value="+(int)Character.MIN_VALUE+"\nMax Value="+(int)Character.MAX_VALUE);
}
}
Ответы (5 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Map с сообщениями:
import java.util.Map;
import java.util.HashMap;
public class Temp {
private static Map<String, String> messages = new HashMap<>();
static {
messages.put("byte" , "Min Value=" + Byte .MIN_VALUE + "\nMax Value=" + Byte .MAX_VALUE);
messages.put("short" , "Min Value=" + Short .MIN_VALUE + "\nMax Value=" + Short .MAX_VALUE);
messages.put("int" , "Min Value=" + Integer .MIN_VALUE + "\nMax Value=" + Integer .MAX_VALUE);
messages.put("long" , "Min Value=" + Long .MIN_VALUE + "\nMax Value=" + Long .MAX_VALUE);
messages.put("float" , "Min Value=" + Float .MIN_VALUE + "\nMax Value=" + Float .MAX_VALUE);
messages.put("double", "Min Value=" + Double .MIN_VALUE + "\nMax Value=" + Double .MAX_VALUE);
messages.put("char" , "Min Value=" + (int)Character.MIN_VALUE + "\nMax Value=" + (int)Character.MAX_VALUE);
}
public static void main(String... args) {
for(String arg : args) {
System.out.println(messages.getOrDefault(arg, "Error"));
}
}
}
Автор решения: Stanislav Volodarskiy
→ Ссылка
Ни одного if:
public class Temp {
private static String[] types = new String[] {
"byte" ,
"char" ,
"double",
"float" ,
"int" ,
"long" ,
"short"
};
private static String[] messages = new String[] {
"Min Value=" + Byte .MIN_VALUE + "\nMax Value=" + Byte .MAX_VALUE,
"Min Value=" + (int)Character.MIN_VALUE + "\nMax Value=" + (int)Character.MAX_VALUE,
"Min Value=" + Double .MIN_VALUE + "\nMax Value=" + Double .MAX_VALUE,
"Min Value=" + Float .MIN_VALUE + "\nMax Value=" + Float .MAX_VALUE,
"Min Value=" + Integer .MIN_VALUE + "\nMax Value=" + Integer .MAX_VALUE,
"Min Value=" + Long .MIN_VALUE + "\nMax Value=" + Long .MAX_VALUE,
"Min Value=" + Short .MIN_VALUE + "\nMax Value=" + Short .MAX_VALUE
};
public static void main(String... args) {
for (String arg : args) {
int index = 3;
index += 2 * Integer.signum(arg.compareTo(types[index]));
index += 1 * Integer.signum(arg.compareTo(types[index]));
index += types.length * Integer.signum(arg.compareTo(types[index]));
String message = "Error";
try {
message = messages[index];
} catch (ArrayIndexOutOfBoundsException e) {
}
System.out.println(message);
}
}
}
Один if. Так немного честнее, так как при проверке ArrayIndexOutOfBoundsException компилятор делает два if:
public static void main(String... args) {
for (String arg : args) {
int index = 3;
index += 2 * Integer.signum(arg.compareTo(types[index]));
index += 1 * Integer.signum(arg.compareTo(types[index]));
String message = "Error";
if (arg.equals(types[index])) {
message = messages[index];
}
System.out.println(message);
}
}
P.S. Не знаю как реализован Integer.signum. Если внутри два if, то получается всего пять.
Автор решения: Дмитрий
→ Ссылка
А если так попробовать:
public static void main(String[] args) throws Exception {
for (int i = 0; i < args.length; i++) {
String className = args[i].replace("char", "Character").replace("int", "Integer");
className = "java.lang." + className.substring(0, 1).toUpperCase() + className.substring(1);
Class<?> clazz = Class.forName(className);
System.out.println("Min Value=" + clazz.getField("MIN_VALUE").get(null));
System.out.println("Max Value=" + clazz.getField("MAX_VALUE").get(null));
}
}
Автор решения: Senior Pomidor
→ Ссылка
public static void main(String[] args) {
String[] types = {"byte", "short", "int", "long", "float", "double", "char"};
int[] minValues = {Byte.MIN_VALUE, Short.MIN_VALUE, Integer.MIN_VALUE, Long.MIN_VALUE, Float.MIN_VALUE, Double.MIN_VALUE, (int) Character.MIN_VALUE};
int[] maxValues = {Byte.MAX_VALUE, Short.MAX_VALUE, Integer.MAX_VALUE, Long.MAX_VALUE, Float.MAX_VALUE, Double.MAX_VALUE, (int) Character.MAX_VALUE};
for (int i = 0; i < args.length; i++) {
for (int j = 0; j < types.length; j++) {
if (args[i].equals(types[j])) {
System.out.println("Min Value=" + minValues[j] + "\nMax Value=" + maxValues[j]);
break;
}
}
}
}
Автор решения: Stanislav Volodarskiy
→ Ссылка
Один if. Так как Map запрещён, сделаем пародию на хеш-таблицу. Хешем будет код первого символа. Он случайно у всех типов разный:
public class Temp {
private static class Type {
public final String name;
public final Number min;
public final Number max;
public Type(String name, Number min, Number max) {
this.name = name;
this.min = min;
this.max = max;
}
};
private static final Type[] index;
static {
index = new Type['s' + 1];
index['b'] = new Type("byte" , Byte .MIN_VALUE, Byte .MAX_VALUE);
index['c'] = new Type("char" , (int)Character.MIN_VALUE, (int)Character.MAX_VALUE);
index['d'] = new Type("double", Double .MIN_VALUE, Double .MAX_VALUE);
index['f'] = new Type("float" , Float .MIN_VALUE, Float .MAX_VALUE);
index['i'] = new Type("int" , Integer .MIN_VALUE, Integer .MAX_VALUE);
index['l'] = new Type("long" , Long .MIN_VALUE, Long .MAX_VALUE);
index['s'] = new Type("short" , Short .MIN_VALUE, Short .MAX_VALUE);
};
public static void main(String... args) {
for (String arg : args) {
Type type = index[arg.charAt(0) % index.length];
if (type != null && type.name.equals(arg)) {
System.out.println("Min Value=" + type.min + "\nMax Value=" + type.max);
} else {
System.out.println("Error");
}
}
}
}