Przechowywanie działań matematycznych

0

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?

0

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.

1

@StaryIniekumaty: Mógłbyś trochę rozwinąć, podać przykłady?

0

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.

2

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ć.

2

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).

0
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

1 użytkowników online, w tym zalogowanych: 0, gości: 1