User-Input aus Zahlen und Operatoren - beste Umsetzung?

B

Blackbam

Gast
Hallo,

ich stehe gerade vor folgendem Problem, für das mir einfach keine schöne Lösung einfallen will:

Es gibt einen User-Input der folgendermaßen aussieht:

Java:
    String op1;    // ein Operand: "+" oder "*" oder "-" oder "/" aus dem User- Input
    String op2;    // ein Operand: "+" oder "*" oder "-" oder "/" aus dem User- Input
    String op3;    // ein Operand: "+" oder "*" oder "-" oder "/" aus dem User- Input
    String op4;    // ein Operand: "+" oder "*" oder "-" oder "/" aus dem User- Input
    String op5;    // ein Operand: "+" oder "*" oder "-" oder "/" aus dem User- Input
    String op6;    // ein Operand: "+" oder "*" oder "-" oder "/" aus dem User- Input
    
    int ubR;    // ein Integer-Wert aus dem User- Input
    int ubG;    // ein Integer-Wert aus dem User- Input
    int ubB;    // ein Integer-Wert aus dem User- Input
    int nbR;    // ein Integer-Wert aus dem User- Input
    int nbG;    // ein Integer-Wert aus dem User- Input
    int nbB;    // ein Integer-Wert aus dem User- Input

    int nR;    // ein Integer-Wert aus dem Programm, der stets variiert
    int nB;    // ein Integer-Wert aus dem Programm, der stets variiert
    int nC;    // ein Integer-Wert aus dem Programm, der stets variiert


Es soll folgende Operation durchgeführt werden:

Java:
/* Pseudo Code Notation */
wert1 = ubR op1 nR op2 nbR;
wert2 = ubG op3 nG op4 ngR;
wert3 = ubB op5 nB op6 ngB;

Natürlich hätte ich jetz die Möglichkeit eine Funktion zu schreiben die 5 Parameter entgegennimmt (siehe unten), mittels switch-case die Operanden auflöst die Rechnung durchführt und ein Ergebnis zurückgibt - allerdings läuft die Berechnung der 3 Werte in einer Schleife ab die 480000 mal in einer Möglichst kurzen Zeit (1/100 Sekunde) ablaufen soll, wobei die Operanden und Variablen bis auf nR/nG/nB immer gleich bleiben. Kennt jemand also eine Möglichkeit, zur Laufzeit eine Funktion zu definieren, der ich dann immer nur mehr 1 Parameter übergeben muss? Oder weiß sonst jemand wie es schneller ginge?


Meine momentane Lösung sieht folgendermaßen aus - überflüßig zu erwähnen, dass wenn 1.5 Millionen Aufrufe in 1/100 Sekunde stattfinden sollen, der PC ziemlich in die Knie geht - bekommen auch zeitweise "Out of Memory" errors:

Java:
int nR = mCV(ubR,op1,rC,op2,nbR);

  public int mCV(int a,String o,int b,String p,int c) {
    int ret = 0;
    if(o == "+") {
      if(p == "+") {
        ret = a+b+c;
      } else if(p=="-") {
        ret = a+b-c;
      } else if(p=="*") {
        ret = a+b*c;
      } else if(p=="/") {
        ret = a+b/c;
      }
    } else if(o=="-") {
      if(p == "+") {
        ret = a-b+c;
      } else if(p=="-") {
        ret = a-b-c;
      } else if(p=="*") {
        ret = a-b*c;
      } else if(p=="/") {
        ret = a-b/c;
      }
    } else if(o=="*") {
      if(p == "+") {
        ret = a*b+c;
      } else if(p=="-") {
        ret = a*b-c;
      } else if(p=="*") {
        ret = a*b*c;
      } else if(p=="/") {
        ret = a*b/c;
      }
    } else if(o=="/") {
      if(p == "+") {
        ret = a/b+c;
      } else if(p=="-") {
        ret = a/b-c;
      } else if(p=="*") {
        ret = a/b*c;
      } else if(p=="/") {
        ret = a/b/c;
      }
    }
    return ret;
  }
 

nrg

Top Contributor
was soll das werden? ein parser für mathematische funktionen?

edit: ansonsten sag mal ganz allgemein, was du haben willst
 

Andi_CH

Top Contributor
Paradebeispiel für eine Rekursion

Multiplikation suchen
Teil links davon auswerten
Teil rechts davon auswerten
Multiplizieren

Wenn keine Multiplikation da - alle addieren

auswerten:
wenn nur zwei werte + operator -> berechnen
ansonsten aufteilen wie oben beschrieben

Nur das Datenformat ist etwas bescheuert für dieses Vorgehen

Was war da wohl am Anfang? Ein String in dem alles drinstand? ja genau, da könnte man ansetzen mit der Rekursion - splitten beim * ------
 
B

Blackbam

Gast
@nrg: Ja, in gewisser Weise ein Parser für mathematische Operationen. Und zwar sind vier Variablen, inklusive der beiden Operatoren, im Ganzen Programm konstant (aber eben erst nach dem Programmstart am Anfang) und ein Wert ist Variabel (Color-Wert eines Pixels).

Konkret geht es um Echtzeit-Bildverarbeitung, die Operation wird also je nach einem User Input am Anfang des Programms für jedes Pixel in jedem neuen Video-Bild durchgeführt.

@Andi_CH: Wieso ist das Datenformat bescheuert? Am Anfang war derweil noch gar nichts, weil das GUI noch nicht umgesetzt ist. Glaubst du dass man sich durch die Rekursion wirklich viel Zeit spart, oder gibts da eventuell noch einen schnelleren Weg?
 

tfa

Top Contributor
Erstmal als Anmerkung: Stringvergleich mit equals, nicht mit ==

Ich würde einmal am Anfang die Operatoren parsen (wenn die sich pro Durchlauf wirklich nie ändern) und mir dann ein Command-Objekt erzeugen und das immer verwenden. So spart man sich das ewige Vergleichen, denn Geschwindigkeit scheint hier ja die Hauptrolle zu spielen:

Java:
interface Operation {
        public int perform(int a, int b, int c);
}

public class OperationPlusMal implements Operation {
        public int perform(int a, int b, int c) {
            return a + b * c;
        }
}
Für jede Operator-Kombination hast du dann eine Klasse. Du musst nur rausfinden, welche.
 

Andi_CH

Top Contributor
@Andi_CH: Wieso ist das Datenformat bescheuert? Am Anfang war derweil noch gar nichts, weil das GUI noch nicht umgesetzt ist. Glaubst du dass man sich durch die Rekursion wirklich viel Zeit spart, oder gibts da eventuell noch einen schnelleren Weg?

"Bescheuert" ist natürlich ein hartes Wort und mit etwas Humor zu lesen.

Wenn ich einen String habe und den bei * splitte
dann die beiden Teile getrennt auswerte bis ein einfacher Term vorliegt ...

Aber so wie es tönt werden die Werte einzeln eingegeben - dann frage ich mich aber warum der Operator als String und nicht als z.B. als Enumeration vorliegt

String.equals braucht sicher mehr Zeit als der Vergleich eines enum
 
Zuletzt bearbeitet:
B

Blackbam

Gast
Hallo,

danke für die Tipps alle, habe das ganze jetzt mit 16 Klassen nach folgendem Schema umgesetzt - wegen Enum/String lässt sich auch noch was machn, ist aber gar nicht mehr so wichtig, da ichs nur noch vor den Schleifen brauche. Scheint fürs erste ganz gut zu laufen!

Java:
interface Operation {
        public int perform(int c);
}
 
public class OperationPlusPlus implements Operation {
  int a;
  int b;
  public OperationPlusPlus(int a, int b) {
    this.a = a;
    this.b = b; 
  }
  public int perform(int c) {
    return a+b+c;
  }
}
 

tfa

Top Contributor
Du kannst im Konstruktor doch auch schon [c]a+b[/c] ausrechnen und als Zwischenergebnis abspeichern. In perform() kannst du dir dann eine Addition sparen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Login für User, der im Hintergrund Schedules ausführt Allgemeine Java-Themen 16
L Super User via Processbuilder (Linux) Allgemeine Java-Themen 3
P USER Management in SQL übergreifend auf JAVA Programm Allgemeine Java-Themen 41
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
W Java Telegram Bot - Eingabe durch User Allgemeine Java-Themen 2
T Loginname von User an PC im Netzwerk holen Allgemeine Java-Themen 2
K Jar/DLL Abhängigkeiten durch User angeben lassen Allgemeine Java-Themen 6
VfL_Freak JDK installieren System-Property "user.dir" Allgemeine Java-Themen 6
Thallius Konzeptproblem User-Interface Allgemeine Java-Themen 5
Thallius User-Settings: Wie handelt ihr das? Allgemeine Java-Themen 4
Bananabert Swing jtree : image als user object Allgemeine Java-Themen 2
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
S Random Passwort für den User + Hashen Allgemeine Java-Themen 6
Guybrush Threepwood Kein user.home unter Windows8 Allgemeine Java-Themen 7
T User Verwaltung mit JPA Allgemeine Java-Themen 2
B Java FTP (common net - user anlegen) Allgemeine Java-Themen 2
C Input/Output Beste Möglichkeit für user non-readable Datei Allgemeine Java-Themen 7
D Daten eines User auslesen. Allgemeine Java-Themen 5
R Welches User-Verzeichnis wählen für Configurationsdateien - Windows Allgemeine Java-Themen 2
R Windows - User Passwort ändern Allgemeine Java-Themen 2
Kr0e User management system Allgemeine Java-Themen 2
H blinde MAC User Allgemeine Java-Themen 15
H user.dir + verknüpfung Allgemeine Java-Themen 5
S "Guessed User name" bei Tomcat belegen Allgemeine Java-Themen 2
G Java Anwendung für Multi-User Allgemeine Java-Themen 2
K Chatengine User auf Chatbot Allgemeine Java-Themen 3
S Änderung an Proberties datei an alle User weitergeben? Allgemeine Java-Themen 7
P URL mit htaccess in Explorer öffnen (ohne user-passwort) Allgemeine Java-Themen 6
K JUnit 4 User Interaktion Allgemeine Java-Themen 7
P System.getProperty("user.dir") Allgemeine Java-Themen 10
B User Login: JPasswordField + JPasswordField_wdh vergleichen Allgemeine Java-Themen 2
J Suse + Tomcat + Sysdeo Plugin: Tomcat als user starten Allgemeine Java-Themen 2
T User-Kennung im Source hinterlegen? Allgemeine Java-Themen 4
T System.getProperty("user.home") Allgemeine Java-Themen 12
S Simple User Interface Frage Allgemeine Java-Themen 13
I Verschlüsselung mit Pwd. - User soll Algorithmus wählen Allgemeine Java-Themen 4
D NT User auslesen aus windows 2000 Allgemeine Java-Themen 2
A Synchronisation Datenquelle und Anwendung (Multi-User) Allgemeine Java-Themen 7
D System.getProperty("user.dir") ? Allgemeine Java-Themen 1
H Zugriff auf statische Methode durch mehrere User Allgemeine Java-Themen 19
J User Klasse in den Vector, Object Klasse wieder raus... Allgemeine Java-Themen 4
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
P Selenium . findElement . input Allgemeine Java-Themen 4
E Input/Output Mikro Input bekommen Allgemeine Java-Themen 4
G Input Frame Allgemeine Java-Themen 6
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
MoxxiManagarm Credential Input Allgemeine Java-Themen 5
Kirby.exe Keyboard Input ohne Enter Allgemeine Java-Themen 43
T JSoup findet input Feld nicht?! Wie kann ich das Feld finden? Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
I Text aus Input-Box entnehmen und zuweisen Allgemeine Java-Themen 1
J Java Sound Api Sound input und Output auswählen Allgemeine Java-Themen 4
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
T Input und Outputstream , serielle Schnittstelle Allgemeine Java-Themen 1
DanielsLPecke Input/Output Arduino input. Allgemeine Java-Themen 4
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
B Input/Output Konsolen input args Allgemeine Java-Themen 6
M Mikrofon Input simulieren Allgemeine Java-Themen 1
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
F FileOutput/Input Objekte Allgemeine Java-Themen 6
C System.in erhält Input von Tastatur. wo wird das festgelegt? Allgemeine Java-Themen 4
N Kalender Normen input/output Allgemeine Java-Themen 2
I Input in cmd Allgemeine Java-Themen 2
K Input file nicht lesbar Allgemeine Java-Themen 9
C Kompletter Pfad aus "input type=file" auslesen Allgemeine Java-Themen 3
P Ascii Bild aus einem input file nur kommt nix im outputfile an?????? Allgemeine Java-Themen 5
D JOptionPane nur 1 Input möglich? Allgemeine Java-Themen 6
I input-/outputstream Allgemeine Java-Themen 6
T Wie kontinuierlichen asci input parsen? Allgemeine Java-Themen 3
N input programm Allgemeine Java-Themen 3
G Taushen der Input variablen einer method Allgemeine Java-Themen 14
J Binärdateien mit Input/Outputstream lesen und schreiben Allgemeine Java-Themen 3
O Input stream geht net Allgemeine Java-Themen 2
M BufferedReader input - hängt sich auf Allgemeine Java-Themen 4
berserkerdq2 Versteht jemand, was diese beiden Zahlen bei dem IJVM Code zu bedeuten haben? Allgemeine Java-Themen 10
L die 3 größten Zahlen im Array Allgemeine Java-Themen 1
A Potenzmenge der Zahlen von 1 bis n Allgemeine Java-Themen 20
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
A String auf Zahlen überprüfen Allgemeine Java-Themen 5
J Zahlen Abstand zur Null bestimmen Allgemeine Java-Themen 11
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
O Variablen Addition von Double-Werten ergibt seltsame 0.9999999 Zahlen Allgemeine Java-Themen 2
B Zufällig zwischen vorgegebenen Zahlen auswählen Allgemeine Java-Themen 6
P Rechnen mit sehr kleinen Zahlen Allgemeine Java-Themen 5
M Zahlen in Array anordnen Allgemeine Java-Themen 8
D Erste Schritte Arrays vergleichen und die zahlen die nur einmal vorkommen ausgeben Allgemeine Java-Themen 5
D Erste Schritte Fehler mit negativen und 0 Zahlen im String Allgemeine Java-Themen 6
T Tesseract OCR mit Zahlen Allgemeine Java-Themen 1
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
F Zahlen zu Bits Allgemeine Java-Themen 3
S Überprüfen, ob 5 Zahlen nebeneinander liegen Allgemeine Java-Themen 5
R Große Zahlen in Worten abkürzen Allgemeine Java-Themen 10
B Arrays mit Text und Zahlen füllen Allgemeine Java-Themen 3
G Aus JTextField Zahlen auslesen und random generieren Allgemeine Java-Themen 10
D Operatoren Logischer Rightshift von negativen Zahlen auf Bit-Ebene Allgemeine Java-Themen 7
L 2-Dimensionaler String: Zahlen verschieben Allgemeine Java-Themen 10
M Algorithmus zum Zahlen einteilen Allgemeine Java-Themen 8
H Fibonacci-Zahlen Allgemeine Java-Themen 5
B Zahlen manuell eingeben und in Array Speichern Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben