2017-02-21 4 views
0

Im folgenden Code versuchte ich, eine Schleife zu erstellen, die meine Zeichenfolge durchlaufen und den Wert jedes Zeichens in der Zeichenfolge der Gesamtvariablen hinzufügen würde.Verwenden einer Variablen als Dictionary-Schlüssel

var stringSent = "babbbababa" 
let charValues = ["a":1,"b":2] 

var total = 0 

for i in stringSent.characters{ 
switch i{ 
    case "a": 
     total += charValues["a"]! 
     //adds 1 to total 
    case "b": 
     total += charValues[i]! 
     //throws error 
    default: 
     print("default was sent") 
} 
print(total) 
} 

Zunächst wollte ich eine for-Schleife verwenden, wie so Leitungen zum wenigsten zu halten, die ich, wenn ich herausfinden kann, zu tun, würde es lieben, wie die Variable „i“ korrekt als Schlüssel verwendet werden, um zu lernen den aktuellen Zeichenwert abrufen.

Mache ich etwas falsch mit meinem Wörterbuch oder ist diese Methode nicht möglich? Ich habe nichts hilfreiches von Apple oder Google gefunden.

Antwort

1

Das Problem ist, dass characters Zeichen sind, aber die Schlüssel in Ihrem Wörterbuch sind Strings. Also einfach konvertieren:

let stringSent = "babbbababa" 
let charValues = ["a":1,"b":2] 

var total = 0 

for i in stringSent.characters{ 
    total += charValues[String(i)]! 
} 

Oder den anderen Weg gehen - angeben, dass die Schlüssel im Wörterbuch sollte Zeichen sein:

let stringSent = "babbbababa" 
let charValues : [Character:Int] = ["a":1,"b":2] 

var total = 0 

for i in stringSent.characters{ 
    total += charValues[i]! 
} 
+0

Vielen Dank für diese Antwort, ich hatte das Gefühl, sie die gleichen Datentypen waren nicht, habe ich versucht das Wörterbuch [Charakter: Int] zu ändern „!“, Aber ich habe nicht das haben also würde es nichts tun. – CogHead

1

Es scheint, dass Sie die gewichtete Summe der Zeichen in der berechnenden String Instanz stringSent (mit einigen bekannten Gewichten für jede Character). Das Problem in Ihrer eigenen Implementierung ist, dass Sie den Wert eines Schlüssels in Ihrem Wörterbuch mit einer Variablen zugreifen möchten, die von der Art der den Schlüssel des dictionariy unterscheidet (Character ist nicht das gleiche wie String)

total += charValues[i]! // 'i' is a Character here 

Sie könnten Ihre Implementierung vereinfachen und ebenfalls die explizite Entpackung (!) auf verschiedene Arten vermeiden, z Anwendung reduce auf die CharacterView von stringSent

var stringSent = "babbbababa" 
let charValues = ["a": 1, "b": 2] 

let total = stringSent.characters.reduce(0) { $0 + (charValues[String($1)] ?? 0) } 
// 16 

(In Bezug auf die ursprüngliche mißverstanden Version dieser Antwort), eine weitere (etwas mehr verschwenderisch) Alternative könnten die Frequenzen der einzelnen Zeichen in der String Instanz berechnen zu stringSent, wonach das zugehörige Gewicht auf jede Frequenz angewendet werden könnte, um die gesamte gewichtete Summe zu berechnen.

var stringSent = "babbbababa" 
let charValues = ["a": 1, "b": 2] 

var freqs: [String: Int] = [:] 
stringSent.characters.forEach { freqs[String($0)] = (freqs[String($0)] ?? 0) + 1 } 
print(freqs) // ["b": 6, "a": 4] 

let total = freqs.reduce(0) { (sum, kv) in 
    sum + (charValues[kv.key].map { kv.value*$0 } ?? 0) } 
// 16 
+1

Nicht vertraut mit reduzieren, werde ich später auf Äpfel Dokumentation nachlesen. Vielen Dank – CogHead

Verwandte Themen