it-swarm.com.de

Erstellen eines "logischen Exklusiv-" Operators in Java

Beobachtungen:

Java hat einen logischen UND-Operator.
Java hat einen logischen OR - Operator.
Java hat einen logischen NOT-Operator.

Problem:

Java hat keinen logischen XOR - Operator, laut Sun . Ich würde gerne eine definieren.

Methodendefinition:

Als Methode wird es einfach wie folgt definiert:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}


Methodenaufruf:

Diese Methode wird auf folgende Weise aufgerufen:

boolean myVal = logicalXOR(x, y);


Betreiber-Nutzung:

Ich hätte lieber einen Operator, der wie folgt verwendet wird:

boolean myVal = x ^^ y;


Frage:

Ich kann nichts finden, wie man einen neuen Operator in Java definiert. Wo soll ich anfangen?

251
eleven81

Java hat einen logischen XOR - Operator, es ist ^ (wie in a ^ b).

Abgesehen davon können Sie keine neuen Operatoren in Java definieren. 

Edit: Hier ist ein Beispiel:

public static void main(String[] args) {
    boolean[] all = { false, true };
    for (boolean a : all) {
        for (boolean b: all) {
            boolean c = a ^ b;
            System.out.println(a + " ^ " + b + " = " + c);
        }
    }
}

Ausgabe:

 false ^ false = false 
 false ^ true = true 
 true ^ false = true 
 true ^ true = false 
635
javashlook

Ist es nicht x! = Y?

286
Maurice Perry

Java hat einen logischen UND-Operator.
Java hat einen logischen OR - Operator.

Falsch.

Java hat

  • zwei logische UND-Operatoren: Normales AND ist & und Kurzschluss AND ist && und
  • zwei logische OR - Operatoren: Normal OR ist | und Kurzschluss OR ist ||.

XOR existiert nur als ^, da eine Kurzschlussauswertung nicht möglich ist.

71
starblue

Möglicherweise haben Sie den Unterschied zwischen & und &&, | und ||.__ falsch verstanden. Der Zweck der Abkürzungsoperatoren && und || besteht darin, dass der Wert des ersten Operanden das Ergebnis bestimmen kann und der zweite Operand nicht ausgewertet werden muss.

Dies ist besonders nützlich, wenn der zweite Operand zu einem Fehler führen würde, z.

if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)

BeiXORmüssen Sie jedoch immer den zweiten Operanden auswerten, um das Ergebnis zu erhalten, sodass die einzig sinnvolle Operation ^ ist.

30
Peter Lawrey

Sie können einfach (a!=b) schreiben 

Dies funktioniert genauso wie a ^ b.

20
Shuliyey

Das liegt daran, dass das Überladen von Operatoren bewusst aus der Sprache ausgeschlossen wurde. Sie haben mit der String-Verkettung ein bisschen "geschummelt", aber darüber hinaus gibt es keine solche Funktionalität.

(Haftungsausschluss: Ich habe nicht mit den letzten beiden Hauptversionen von Java gearbeitet. Wenn es jetzt läuft, bin ich sehr überrascht)

8
Kevin Anderson

Der folgende Code:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

ist überflüssig.

Warum nicht schreiben:

public static boolean logicalXOR(boolean x, boolean y) {
    return x != y;
}

?

Wie auch javashlook sagte , gibt es bereits ^-Operator.

!= und ^ funktionieren identisch * für boolesche Operanden (Ihr Fall), jedoch für Ganzzahloperanden anders.

* Anmerkungen:
1. Sie arbeiten identisch für boolean (primitiver Typ), nicht jedoch für Boolean (Objekttyp). Als Boolean (Objekttyp) können Werte den Wert null haben. Und != gibt false oder true zurück, wenn einer oder beide seiner Operanden null sind, während ^ in diesem Fall NullPointerException auslöst.
2. Obwohl sie identisch arbeiten, haben sie unterschiedliche Prioritäten, z. Bei Verwendung mit &: a & b != c & d wird als a & (b != c) & d behandelt, während a & b ^ c & d als (a & b) ^ (c & d) (offtopic: ouch, C-style Precedence Table Sucks) behandelt wird.

7
Sasha

Der einzige Operator, der in Java überladen wird, ist + bei Strings ( JLS 15.18.1 String Concatenation Operator + ). 

Die Community ist seit Jahren in 3 geteilt, 1/3 will es nicht, 1/3 will es und 1/3 ist es egal.

Sie können Unicode verwenden, um Methodennamen zu erstellen, die Symbole sind. Wenn Sie also ein Symbol verwenden möchten, können Sie myVal = x verwenden. $ (Y); Dabei ist $ das Symbol und x kein Primitiv ... aber das wird in manchen Editoren zwielichtig sein und ist einschränkend, da Sie es nicht mit einem Primitiv machen können.

7
TofuBeer

Hier ist eine var arg XOR Methode für Java ...

public static boolean XOR(boolean... args) {
  boolean r = false;
  for (boolean b : args) {
    r = r ^ b;
  }
  return r;
}

Genießen

6

Sie können Xtend (Infix-Operatoren und Operator-Überladung) verwenden, um Operatoren zu überladen und auf Java "zu bleiben"

2
iga

Was Sie verlangen, würde nicht viel Sinn machen. Wenn ich nicht falsch bin, schlagen Sie vor, dass Sie XOR verwenden möchten, um logische Operationen auf dieselbe Weise wie AND und OR auszuführen. Ihr bereitgestellter Code zeigt, worauf ich mich beziehe:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

Ihre Funktion verfügt über boolesche Eingänge. Wenn bitweise XOR für boolesche Werte verwendet wird, entspricht das Ergebnis dem von Ihnen bereitgestellten Code. Mit anderen Worten, bitweise XOR ist bereits effizient, wenn einzelne Bits (Booleans) oder die einzelnen Bits in größeren Werten verglichen werden. Um dies in einen Kontext zu setzen, ist in Bezug auf binäre Werte jeder Wert ungleich Null WAHR und nur NULL ist falsch.

Damit XOR auf die gleiche Weise angewendet wird, in der Logical AND angewendet wird, würden Sie entweder nur binäre Werte mit nur einem Bit verwenden (was dasselbe Ergebnis und dieselbe Effizienz ergibt) oder der binäre Wert müsste stattdessen als Ganzes ausgewertet werden von pro Bit. Mit anderen Worten, der Ausdruck (010 ^^ 110) = FALSE anstelle von (010 ^^ 110) = 100. Dies würde den Großteil der semantischen Bedeutung aus der Operation entfernen und stellt einen logischen Test dar, den Sie sowieso nicht verwenden sollten.

2
user2904660

Logisches Exklusiv-oder in Java heißt !=. Sie können auch ^ verwenden, wenn Sie Ihre Freunde verwirren möchten.

1
Doradus

Ich verwende die sehr beliebte Klasse "org.Apache.commons.lang.BooleanUtils"

Diese Methode wird von vielen Benutzern getestet und ist sicher. Viel Spass.

boolean result =BooleanUtils.xor(new boolean[]{true,false});
1
Adam111p

A und B müssten boolesche Werte sein, damit! = Dasselbe wie xor ist, damit die Wahrheitstabelle gleich aussieht. Sie könnten auch! (A == B) lol verwenden.

1
John Theibert

Hier ist ein Beispiel:

Bei 2 int-Werten wird true zurückgegeben, wenn einer negativ und einer positiv ist. Außer wenn der Parameter "negativ" true ist, wird true nur zurückgegeben, wenn beide negativ sind. 

    public boolean posNeg(int a, int b, boolean negative) {
      if(!negative){
        return (a>0 && b<0)^(b>0 && a<0);
      }
      else return (a<0 && b<0);
    }
0
Shadman Sudipto

Da der boolesche Datentyp wie eine Ganzzahl gespeichert wird, funktioniert der Bitoperator ^ wie eine Operation XOR, wenn er mit booleschen Werten verwendet wird.

//©Mfpl - XOR_Test.Java

    public class XOR_Test {
        public static void main (String args[]) {
            boolean a,b;

            a=false; b=false;
            System.out.println("a=false; b=false;  ->  " + (a^b));

            a=false; b=true;
            System.out.println("a=false; b=true;  ->  " + (a^b));

            a=true;  b=false;
            System.out.println("a=true;  b=false;  ->  " + (a^b));

            a=true; b=true;
            System.out.println("a=true; b=true;  ->  " + (a^b));

            /*  output of this program:
                    a=false; b=false;  ->  false
                    a=false; b=true;  ->  true
                    a=true;  b=false;  ->  true
                    a=true; b=true;  ->  false
            */
        }
    }
0
Ledón

sie müssen zu Scala wechseln, um Ihre eigenen Operatoren zu implementieren

Rohrbeispiel

0
mut1na