2017-07-19 1 views
-1

Im folgenden Code:ist ein Fehler mit einem ternären Operator

public Map<Integer, Integer> leavesCount = new HashMap<Integer, Integer>(); 

public void addLeaf(int leaf, int count){ 
    leavesCount.containsKey(leaf) ? leavesCount.put(leaf, leavesCount.get(leaf) + count) : leavesCount.put(leaf, count); 
} 

ich folgende Fehlermeldung erhalten, mit leaf innerhalb der containsKey:

Type mismatch: cannot convert from int to boolean 

Wer weiß, wie das Problem zu lösen?

+0

Sie ordnen das Ergebnis nichts zu. – OldProgrammer

+1

Sie müssen eine 'if'-Anweisung verwenden, der ternäre Operator dient nur zur Verwendung als Ausdruck. – Clashsoft

+1

Sind Sie sicher, dass Sie diesen Fehler in diesem Code erhalten? Ihr Code sollte einen anderen Fehler erzeugen. – talex

Antwort

1

es Rewrite zu

leavesCount.put(leaf, leavesCount.containsKey(leaf) ? (leavesCount.get(leaf) + count) : count) 
0

Sie leavesCount.containsKey(leaf) ? leavesCount.put(leaf, leavesCount.get(leaf) + count) : leavesCount.put(leaf, count); mit

if (leavesCount.containsKey(leaf)) { 
     leavesCount.put(leaf, leavesCount.get(leaf) + count); 
    } else { 
     leavesCount.put(leaf, count); 
    } 
1

ersetzen sollte, das nicht ist, wie ternären Operationen arbeiten. Um ein ternäres zu verwenden, möchten Sie die Funktion zu

ändern, die nicht wirklich Best Practice ist. Sie sind besser dran mit einer if-Anweisung.

public void addLeaf(int leaf, int count){ 
    if(leavesCount.containsKey(leaf)){ 
     leavesCount.put(leaf, leavesCount.get(leaf) + count); 
    }else{ 
     leavesCount.put(leaf, count); 
    } 
} 

Der Grund dafür ist die Lesbarkeit. Das Einfügen eines Ternärs in Funktionsaufrufe kann unordentlich werden.

Sie können es auch in eine Var verschieben.

public void addLeaf(int leaf, int count){ 
    count = leavesCount.containsKey(leaf) ? leavesCount.get(leaf) + count : count; 
    leavesCount.put(leaf, count) 
} 
+0

Diese zweite Empfehlung hat Ihnen meine Stimme gegeben. Dies ist nicht der Ort für die Verwendung von ternären Operator. –

1

In Java 8, dann ist es eine elegante integrierte Methode zu tun, was Sie wollen:

public Map<Integer, Integer> leavesCount = new HashMap<>(); 

public void addLeaf(int leaf, int count) { 
    leavesCount.merge(leaf, count, Integer::sum); 
} 

Dies verwendet Map.merge Methode, die den Schlüssel und den Wert erwartet, zusammen mit einer Merge-Funktion, die den alten Wert mit dem neuen Wert zusammenführt, wenn der Schlüssel bereits in der Karte vorhanden war.

Für die Merge-Funktion verwende ich Integer::sum, die eine Methode Referenz auf die Integer.sum Methode ist. Diese Methodenreferenz verhält sich wie eine BiFunction<Integer, Integer, Integer>, d. H. Sie erwartet zwei Werte und gibt ihre Summe zurück.

Verwandte Themen