Boolsche Ausdrücke minimieren

membersound

Bekanntes Mitglied
Hallo,

kann ich a == b || a == c irgendwie minimieren? Rein logisch würde ich halt a == (b || c) schreiben, aber das ist wohl verkehrt. Gibt es also keine Möglichkeit der Minimierung?

Danke
 
Mir ist da keine bekannt, außer die ganze Bedingung einfach als Methode zu machen, was etwas übersichtlicher ist.
Jedoch sowas, was du hier vorschlägst, habe ich (leider) noch nicht bei Java gefunden.
 
Ich glaube da denkst du zu mathematisch. Egal wie du das schreibst, der Prozessor muss das dann ohnehin einzeln vergleichen.
 
kann ich a == b || a == c irgendwie minimieren? Rein logisch würde ich halt a == (b || c) schreiben, aber das ist wohl verkehrt. Gibt es also keine Möglichkeit der Minimierung?
Was verstehst du denn unter "Minimierung", auf welche Größe beziehst du dich dabei? Länge des Ausdrucks im Quelltext? Anzahl der Rechenoperationen im Kompilat? Maximale/minimale/durchschnittliche Anzahl der tatsächlich ausgeführten Rechenoperationen? Es gibt bestimmt noch mehr Möglichkeiten, aber diese fallen mir spontan ein.

Was ist denn überhaupt das Problem? Tippfaulheit? Geschwindigkeit? Leserlichkeit?

Ohne mehr Kontext und Benennung des Problems kann man da schlecht eine im Allgemeinen "gute" Richtung angeben. Du müsstest also schon etwas mehr sagen.

Ark
 
Eins vorweg: Jetzt kommt Pseudocode, welcher so in Java nicht funktioniert

Rein von der Lesbarkeit des Codes her wäre ein Konstrukt der Art
Code:
if ( [b, c, d, e] contains a ) then ...
bzw. als Methode aller Arrays
Code:
if ( [b, c, d, e].contains(a) ) then ...
bzw. die umgekehrte Notation (zu welcher eine Implementierung als Methode aller einzelnen Elemente wenig sinnvoll ist)
Code:
# welche konkrete Bezeichnung hier am sinnvollsten ist, kann man beim Design einer entsprechenden Sprache diskutieren
if ( a is_in [b, c, d, e] ) then ...
if ( a element_of [b, c, d, e] ) then ...
if ( a is_element_of [b, c, d, e] ) then ...
in der Tat eine feine Sache, da es (insbesondere die letzte Möglichkeit) einer natürlichsprachigen Formulierung entspräche (einfach mal zum Test die Codezeilen laut vorlesen). Ist technisch problemlos umsetzbar und existiert so ähnlich auch schon. Nun ist Java aber Java und nicht sowas wie Ruby und damit hat sich das Thema dann auch schon wieder erledigt, bzw. muss über Umwege wie Methoden oder Fremdbibliotheken gelöst werden.
 
Also wenn ich a mit b, c, d, e vergleichen müsste, je nach den Objekten wird der Ausdruckt dann ziemlich unübersichtlich.
Vielleicht ist ja das, was du suchst, eine Konstruktion mit [c]switch[/c]. Vielleicht geht das aber nicht, und du suchst etwas wie ein Set oder BitSet. Vielleicht brauchst du tatsächlich eine Liste, aber die kann dann vielleicht auch sortiert sein (kann das Suchen beschleunigen). Vielleicht geht es aber tatsächlich auch nicht besser, und du suchst eigentlich eine if-else-Kaskade.

Je nach Situation (die wir hier leider nicht sehen) kann das eine oder andere sinnvoll oder weniger sinnvoll sein.

Ark
 
Wobei das von Landei vorgeschlagene
Code:
Arrays.asList(b,c,d,e,f).contains(a)
eine ziemliche brauchbare Alternative darstellt. Kürzer und knackiger wirst du es in Java kaum noch hinbekommen.
 
Kürzer und knackiger wirst du es in Java kaum noch hinbekommen.
Kann sein, muss nicht sein. (Die Situation kennen wir ja nicht.) Eine Schleife mit Stringkonkatenation à la [c]+=[/c] ist zwar auch kurz und knackig, aber auch ein sehr häufiger Grund für Themen im Anfängerforum.

Grundsätzlich widerstrebt zumindest mir(!) bei diesem Vorschlag die Vorstellung, dass jedes Mal ein neues Array und ein neues List-Objekt erzeugt werden. Außerdem liegt die Suchkomplexität in O(n); das lässt sich zwar nicht unbedingt, aber je nach Situation eben doch vermeiden. (Wenn die Liste wirklich nur aus 4 Elementen besteht, kann es egal sein.)

Ark
 
Allgemein kam mir diese Frage schon öfters in den Sinn, bei verschiedenen Situationen.

Konkret geht es diesmal um ein KeyEvent, welches auf verschiedene Tasten hin eine Methode aufrufen soll.
Java:
evt.getKeyCode() == KeyEvent.VK_DELETE || [...] ESCAPE, ...
Da hätte ich es praktisch gefunden, wenn ich einfach die KeyEvents aufzählen könnte.
 
Allgemein kam mir diese Frage schon öfters in den Sinn, bei verschiedenen Situationen.

Konkret geht es diesmal um ein KeyEvent, welches auf verschiedene Tasten hin eine Methode aufrufen soll.
Java:
evt.getKeyCode() == KeyEvent.VK_DELETE || [...] ESCAPE, ...
Da hätte ich es praktisch gefunden, wenn ich einfach die KeyEvents aufzählen könnte.

was du bei einem switch/case ja machen kannst
 
Konkret geht es diesmal um ein KeyEvent, welches auf verschiedene Tasten hin eine Methode aufrufen soll.
Java:
evt.getKeyCode() == KeyEvent.VK_DELETE || [...] ESCAPE, ...
Da hätte ich es praktisch gefunden, wenn ich einfach die KeyEvents aufzählen könnte.
Wie bygones schon angedeutet hat, hier etwas konkreter:
Java:
switch(evt.getKeyCode()){
    case KeyEvent.VK_DELETE:
    case KeyEvent.VK_ESCAPE:
    case KeyEvent.VK_CLEAR:
        System.out.println("get me outta here!");
        break;
    case KeyEvent.VK_F1:
        System.out.println("help me!");
        break;
    default:
        System.out.println("I totally don't understand!");
        break;
}
Ark
 

Zurück
Oben