2017-07-06 8 views
0

私は人を連れて行こうとしているだけでなく、並べ替えるだけでなく、すべての人の前に最初の文字を追加していますこの手紙でアドレス帳のような文字を名前の配列に追加する

[ダニエル]、[マイケル]、[リサ]、[レナ] M "、" Michael "]

私は何か遊び場で働いていますが、私にとっては、人が数千人以上になると、これは地獄のように醜いものになり、パフォーマンスについては考えられません。

//: Playground - noun: a place where people can play 

import Cocoa 

var previousName: String? 

let people = ["Martin", "Michael", "Lisa", "Lena", "Dirk"] 
var peopleWithLetters: [String] = [] 

people.sorted { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending }.forEach { 
    if $0.uppercased().characters.first! != previousName?.uppercased().characters.first! { 
     peopleWithLetters.append("\($0.uppercased().characters.first!)") 
    } 
    previousName = $0 
    peopleWithLetters.append($0) 
} 

ベストプラクティスを合理化したりフォローしたりするには、どのような考えがあれば幸いです。

+1

"醜い地獄"はSwiftを使った正しいアプローチのようです。 * SCNR * –

+0

アルファベットを追加して並べ替えます。 – Willeke

+0

興味深いアイデア!しかし、名前が付いていない文字を取り除く必要があります。 新しいSwift 4の構文を確認しましたが、 "グループ化"を使って辞書を初期化する新しい方法があります。 – Daniel

答えて

0

これは、機能プログラミングが輝く完璧なユースケースです。

    名の
  • 地図配列最初の文字
  • の配列に名前
  • ソートここで配列

がコードであるとの手紙コンバイン重複

  • を削除するには、setを使用します。

    //: Playground - noun: a place where people can play 
    
    func addSections(in words: [String]) -> [String] { 
        let sections = Set(words.map { String($0[$0.startIndex]) }) 
        let wordsWithSections = words + sections 
        return wordsWithSections.sorted { $0 < $1 } 
    } 
    
    let names = ["Daniel", "Michael", "Lisa", "Lena"] 
    addSections(in: names) 
    

    あなたがあなたのコメントの中で言及したような辞書を使っている方がよいでしょう。

  • +0

    ようこそ、ありがとう。 – Daniel

    関連する問題