Czy da się przechowywać działania matematyczne w jakiś kolekcjach, w taki sposób, aby później była możliwość przypisania ich do int?
Najpierw musisz ponumerować wszystkie działania i pogrupować według liczby argumentów. Większość działań będzie dwuargumentowych. Liczby to już można przechować. Potem, potrzebna jest funkcja zawierająca switch
, która wykonuje takie lub inne działanie na argumentach w zależności od liczby przechowywanej w kolekcji. Tak właśnie mniej więcej działa procesor i asembler. Nie przechowuje rozkazów jako takich, tylko przechowuje numer rozkazu i argumenty. W najprostszych implementacjach numer rozkazu (opcode) to jest jedna liczba. Kolejne liczby to są ewentualne argumenty.
@StaryIniekumaty: Mógłbyś trochę rozwinąć, podać przykłady?
Chciałbym znaleźć wyniki działania np. czterech cyfr z wszystkimi ich permutacjami oraz wariacjami z powtórzeniami operatorów matematycznych: +,-,*,/. Czyli np. mam cztery cyfry: 3, 5, 7, 9 i chciałbym mieć listę wszystkich działań z wykorzystaniem tych cyfr i tych czterech operatorów matematycznych.
Drzewko sobie zrób po prostu. Niech każde działanie przyjmuje dwa argumenty, które mogą być literałem (liczbą) albo innym działaniem. Na rekordach albo sealed klasach to można ładnie zrobić.
Coś takiego jak poniżej można.
interface Expression {
int evaluate ();
}
class ValueExpr implements Expression {
private int value;
/* To opcjonalnie, zależy od podejścia. */
public void updateValue (int val) {
value = val;
}
public ValueExpr (int val) {
upateValue (val);
}
public int evaluate () {
return value;
}
}
class AdditionExpr implements Expression {
private Expression operand1, operand2;
public AdditionExpr (Expression o1, Expression o2) {
operand1 = o1;
operand2 = o2;
}
public int evaluate () {
rerurn operand1.evaluate () + operand2.evaluate ();
}
}
/* I podobnie dla wszystkich działań. */
Rozwiązanie @andrzejlisek też jest dobre, ale jakby nie w stylu Javy (w porównaniu z moim).
Map<String, BiFunction<Integer, Integer, Integer>> operations;
BiFunction<Integer, Integer, Integer> add = Integer::sum;
BiFunction<Integer, Integer, Integer> subtract = (x, y) -> x - y;
BiFunction<Integer, Integer, Integer> multiply = (x, y) -> x * y;
BiFunction<Integer, Integer, Integer> divide = (x, y) -> x / y;
operations = Map.of(
"add", add,
"subtract", subtract,
"multiply", multiply,
"divide", divide
);
W sumie to nie wiem o co chodzi, ale takie coś przyszło mi do głowy jako pierwsze. :D