23.03.2016 / 11:37 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| ВитаминКО, ты с типами накосячил. У тебя operator - String, результат считается в double, а присваивается в String. Перебирать операции или создавать ассоциативный массив тебе всё равно придётся, потому что нельзя просто так задать соответствие между "+" и Operations.PLUS. Operations op = Operations.valueOf(operator); // но так operator должен иметь имя Enum - "PLUS", "MINUS", ...
result = String.valueOf(op.getResult(argument1, argument2));
// Разве что вот так перебирать.
for (Operations op : Operations.values()) {
if (op.operator.equals(operator)) {
result = String.valueOf(op.getResult(argument1, argument2));
break;
}
}
__________________
let live Изменено aNNiMON (23.03 / 11:42) (всего 2 раза) |
23.03.2016 / 11:39 | |
ВитаминКО Супермодератор Сейчас: Offline
Имя: Василиус Откуда: RZN Регистрация: 20.04.2012
| http://annimon.com/forum/?act=post&id=458493Вроде понял, чего не хватает, тестирую.. aNNiMON, ща проверю и типы. Не, исключение кидает, No enum const class. Сейчас попробую метод тот модифицировать и уже от этого буду исходить. Да, перебор как раз хотел добавить. __________________
わからない!! Изменено ВитаминКО (23.03 / 11:45) (всего 3 раза) |
23.03.2016 / 11:45 | |
Ginosaji Пользователь Сейчас: Offline
Имя: Игорь Откуда: Воронеж Регистрация: 30.01.2010
| ВитаминКО, через Enum тогда можно так: Вместо: result = operator.getResult(argument1, argument2);
так: Operations op = Operations.valueOf(operator);
result = op.getResult(argument1, argument2);
Изменено Ginosaji (23.03 / 11:47) (всего 1 раз) |
23.03.2016 / 12:28 | |
ВитаминКО Супермодератор Сейчас: Offline
Имя: Василиус Откуда: RZN Регистрация: 20.04.2012
| в общем, как-то так Run.java Run.java import java.util.Scanner;
public class Run {
private static Scanner sc = new Scanner(System.in);
// ...
public void runApp() {
// ...
EOperations operator = getOperator();
double result = operator.getResult(argument1, argument2);
// ...
}
private EOperations getOperator() {
System.out.println("Enter operation: ");
while (true) {
EOperations operator = EOperations.getResult(sc.next());
if (operator != EOperations.DEFAULT_OPERATION) {
return operator;
}
}
}
}
EOperations.java EOperations.java public enum EOperations {
OP_ADDITION("+") {
@Override
public double getResult(double arg1, double arg2) {
return arg1 + arg2;
}
},
// ...
DEFAULT_OPERATION(null) {
@Override
public double getResult(double arg1, double arg2) {
throw new UnsupportedOperationException("Unsupported operation!");
}
};
public String op;
private EOperations(String op) {
this.op = op;
}
public static EOperations getResult(String op) {
for (EOperations operator : EOperations.values()) {
if (op.equals(operator.op)) {
return operator;
}
}
return DEFAULT_OPERATION;
}
public abstract double getResult(double arg1, double arg2);
}
Работает, остается только допилить проверки на нуль и т.д., работу в цикле и дополнительные исключения выбрасывать. Сяп за помощь Потом попробую с интерфейсами еще __________________
わからない!! Изменено ВитаминКО (23.03 / 12:30) (всего 1 раз) |
23.03.2016 / 12:46 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| ВитаминКО, с интерфейсами всё-таки меньше кода. А здесь ты Enum используешь не по назначению. К тому же, перебор в цикле не есть хорошо. Гораздо быстрее будет работать, если воспользуешься HashMap. private static final Map<String, Operation> operations;
static {
operations = new HashMap<>();
operations.put("+", new Operation() {
public double getResult(double a, double b) {
return a + b;
}
}
}
interface Operation {
double getResult(double arg1, double arg2);
}
// Operation getOperator()
System.out.println("Enter operation: ");
String op;
do {
op = sc.next();
} while (!operations.containsKey(op));
return operations.get(op);
__________________
let live Изменено aNNiMON (23.03 / 12:47) (всего 1 раз) |
23.03.2016 / 13:35 | |
ВитаминКО Супермодератор Сейчас: Offline
Имя: Василиус Откуда: RZN Регистрация: 20.04.2012
| aNNiMON, я не настолько продвинут, чтобы так далеко заходить. Нам дали задание - заюзайте перечисления вместо ваших дрянных свитчей. ООП только началось, а до коллекций и тп еще далеко. Да, скопировать - скопирую, только я все равно пока не пойму, не хочу нагружаться. У нас цель - написать не столько быстрый, сколько читабельный, легко расширяемый и понятный код. Придерживаясь Java Conventions. скучаю по паскалю __________________
わからない!! |
23.03.2016 / 13:40 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Цитата ВитаминКО: Нам дали задание - заюзайте перечисленияC этого бы и начинал. Цитата ВитаминКО: У нас цель - написать не столько быстрый, сколько читабельный, легко расширяемый и понятный код.Насчёт понятности ладно, каждому своё, а вот расширяемости в Enum'ах нет.
__________________
let live |
23.03.2016 / 15:55 | |
mcdevil Пользователь Сейчас: Offline
Имя: null Регистрация: 17.10.2015
| Sweety, Этот код не работает на me, не знаю на се как работает. Вообщем в вектор добавляются элементы типы которых не известны, нужно например сложить два элемента, но нужно определить какому типу относятся эти элементы с максимальной производительностью. |
23.03.2016 / 21:11 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| ВитаминКО, энамки не наследуются |
23.03.2016 / 21:12 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| mcdevil, visitor в помощь
|