#java #oop #design-patterns #enums
Вопрос:
Учитывая список типов данных , например ['long', 'int', 'short']
, как выбрать наиболее подходящий тип данных, который может обрабатывать любое значение любого из заданных типов?
В этом случае лучшим типом данных является long
. Так что возвращайся long
. У меня уже есть способ(грубая сила) , но я ищу правильный способ справиться с этим. Предложите мне лучший подходящий дизайн.
Ниже приведено мое текущее решение:
static Map<String, List<String>> map = new HashMap<>();
static {
map.add("long", Lists.newArrayList("long", "int", "short", "byte"));
map.add("int", Lists.newArrayList("int", "short", "byte"));
.
.
}
public void String suitableDataType(List<String> input) {
if (input.contains("long") amp;amp; input.stream().allMatch(t -> map.get("long").contains(t)))
return "long";
else if(..int..)
return "int";
.
.
.
else
return "string";
}
В основном создайте карту типа данных для всех возможных типов данных, которые он может поддерживать.
И проверьте вручную в порядке long, int, short
внутри input
, а также проверьте, поддерживаются ли все типы данных внутри input
с помощью карты, и верните соответствующий тип.
Но меня такой подход не устраивает. Поэтому мы ищем лучший способ решить эту проблему.
Спасибо.
Комментарии:
1. Вам нужно уточнить, почему вас не устраивает такой подход.
Ответ №1:
Я думал, что перечисление может быть полезным, но вы можете использовать другой подход, например, карту. Дело в том, чтобы с каждым типом было связано числовое значение.
Я думаю, что переименовал метод и изменил тип возвращаемого значения … пожалуйста, рассмотрите только концепцию
private enum TYPE {
LONG, INT, SHORT, BYTE;
}
private static void examine(List<String> input){
TYPE type = TYPE.LONG;
for (String key : input) {
switch(key){
case "byte":
System.out.print("byte");
return;
default:
type = type.ordinal() < TYPE.valueOf(key.toUpperCase()).ordinal() ? TYPE.valueOf(key.toUpperCase()) : type;
break;
}
}
System.out.println(type);
}
Вы рассмотрели «строку» как значение по умолчанию; в моем примере я использовал вместо этого «байт», но и в этом случае главное-логика. Как только вы установите иерархию типов данных, все станет следствием.
В худшем случае все делается в O(n).