2016-03-22 23 views
0

Dieser Code wird verwendet, um ein String-Array nach dem ersten Buchstaben zu gruppieren.Kombinieren Sie zwei Schleifen zu einem

//plain array 
var list = ["apple", "apricot", "banana", "blackberry"] 

//dictionary of arrays 
var dict = Dictionary<String, Array<String>>() 

//create necessary keys from first characters 
for word in list { 
    dict[ String(word.characters.prefix(1)) ] = [ ] 
} 

//add words to the key of their first character 
for word in list { 
    dict[ String(word.characters.prefix(1)) ]?.append(word) 
} 

//output dictionary 
print(dict) 

Dieses Beispiel ausgeben würde ein Wörterbuch wie folgt aus:

[ "b": ["ba", "bb"], 
    "a": ["aa", "ab"] ] 

Der Code hat zwei ähnliche for Schleifen. Können sie zu einer einzigen Schleife zusammengefasst werden, ohne dass sich dies auf die Ausgabe auswirkt?

Antwort

3

Ton wie ein perfekter Job für eine groupBy Funktion:

extension Array { 
    func groupBy<T: Hashable>(f: Element -> T) -> [T: [Element]] { 
     var results = [T: [Element]]() 
     for element in self { 
      let key = f(element) 
      if results[key] != nil { 
       results[key]!.append(element) 
      } else { 
       results[key] = [element] 
      } 
     } 
     return results 
    } 
} 

var list = ["apple", "apricot", "banana", "blackberry"] 
let dict = list.groupBy { 
    String($0.characters.prefix(1)) 
} 

Gehen wir durch sie Schritt für Schritt:

  • groupBy nimmt eine Funktion, die das Array einen Schlüssel zu jedem Element gibt. Es gibt ein Wörterbuch mit den Schlüsseln und der Liste der Elemente zurück, die denselben Schlüssel haben.
  • f ist diese Schlüssel-geben Funktion. Überprüfen Sie für jedes Element im Array, ob das Ergebniswörterbuch diesen Schlüssel bereits enthält. Wenn ja, wird es an die Liste der Elemente für diesen Schlüssel angehängt. Wenn nein, wird ein neues Array für diesen Schlüssel erstellt.
+0

Das macht Sinn. Ich habe nicht an "groupBy" gedacht. Daher muss die Funktion nur prüfen, ob der Schlüssel bereits erstellt wurde, bevor das Element hinzugefügt wird. –

+0

Kann die Reihenfolge der Schlüssel beibehalten werden? –

+1

Wörterbücher haben keine Reihenfolge. Holen Sie sich die Liste der Schlüssel, sortieren Sie sie und durchlaufen Sie das Diktat in dieser Reihenfolge –

1
//plain array 
    let list = ["apple", "apricot", "banana", "blackberry"] 

    //dictionary of arrays 
    var dict = Dictionary<String, Array<String>>() 

    //create necessary keys from first characters 
    for word in list { 

     if let _ = dict[ String(word.characters.prefix(1))] { 
      dict[ String(word.characters.prefix(1))]?.append(word) 
     } 
     else{ 
      dict[ String(word.characters.prefix(1)) ] = [word] 
     } 
    } 

    //output dictionary 
    print(dict) 
Verwandte Themen