2016-04-26 5 views
1

単語と各単語のcaracterの数を含む文字列から辞書を作成したいと思います。Swiftフレーズから文字数のある辞書を取得する方法

var textToShow:String = "Try not to become a man of success, but" //rather try to become a man of value. Albert Einstein" 

    print(charactersCount(textToShow)) 

func charactersCount(s: String) -> Dictionary<String, Int> { 
    var words = s.componentsSeparatedByString(" ") 
    var characterInWordDictionary = Dictionary<String, Int>() 

    for word in words { 
      characterInWordDictionary[word] = word.characters.count 
    } 
    return characterInWordDictionary 
} 

問題はこのMethodeので、である、それはそれはとても悪くないです

["Try": 3, "not": 3, "a": 1, "become": 6, "of": 2, "but": 3, "man": 3, "to": 2, "success,": 8] 

を返しますが、: を - 最初、辞書は正しい順序 ではありません - 第二に、私は希望辞書の中のスペースも同様です。私は返すしたい何

は次のとおりです。

["Try": 3, " ": 1, "not": 3, " ": 1, "to": 2, " ": 1, "become": 6, " ": 1, "a": 1, " ": 1, "man": 3, " ": 1, "of": 2, " ": 1, "success,": 8, " ": 1, "but": 3] 

誰もがこの上の任意のガイダンスを提供することができた場合、それは素晴らしいだろう。

TKS、

+2

辞書には順序がありません。タプルの配列が必要です –

+1

辞書は順序付けされていないコレクションなので、探しているのはおそらく辞書ではなくタプル '(String、Int)'の配列です。 – dfri

答えて

1

まず、空のtupleArrayを作成します。次に、componentsSeparatedByStringを使用して文を分割し、forEachを使用してその要素($ 0 =単語)とその文字数の後に( ""、1)のタプルを追加してすべての要素(単語)を繰り返し処理します。次に、popLastを使用して余分なタプルを削除します。次のようにしてください:

let textToShow = "Try not to become a man of success, but" 

var tupleArray:[(String, Int)] = [] 

textToShow.componentsSeparatedByString(" ") 
      .forEach{tupleArray += [($0,$0.characters.count),(" ",1)]} 
tupleArray.popLast() 
print(tupleArray.description) // "[("Try", 3), (" ", 1), ("not", 3), (" ", 1), ("to", 2), (" ", 1), ("become", 6), (" ", 1), ("a", 1), (" ", 1), ("man", 3), (" ", 1), ("of", 2), (" ", 1), ("success,", 8), (" ", 1), ("but", 3)]\n" 
+0

この問題は、単語間のスペースが必ずしも長さ1であるとは限りません。また、スペースで終わるとどうなりますか?または、それがスペースで始まっていれば。すべてのケースを扱うわけではありません。 –

+0

@MateHegedusこれらのケース文字列は正しくフォーマットされていません –

+0

あなたはどのように知っていますか? –

1

私はこれを行うあなたのための少しの関数を書いた:

var textToShow:String = "Try not to become a man of success, but" // rather try to become a man of value. Albert Einstein" 



func charactersCount(s: String) -> [(String, Int)] { 
    var result = [(String, Int)]() 

    var word = String(s[s.startIndex.advancedBy(0)]) 
    var size = 1 

    var space = s[s.startIndex.advancedBy(0)] == " " 

    for (var i:Int = 1; i < s.characters.count; i++) { 
     if (s[s.startIndex.advancedBy(i)] == " ") { 
      if (space) { 
       size++ 
       word.append(s[s.startIndex.advancedBy(i)]) 
      } else { 
       result.append((word, size)) 
       size = 1 
       space = true 
       word = " " 
      } 
     } else { 
      if (space) { 
       result.append((word, size)) 
       size = 1 
       space = false 
       word = String(s[s.startIndex.advancedBy(i)]) 
      } else { 
       size++ 
       word.append(s[s.startIndex.advancedBy(i)]) 
      } 
     } 
    } 
    result.append((word, size)) 

    return result 
} 

print(charactersCount(textToShow)) 

を出力は次のとおりです。

["Try": 3, " ": 1, "not": 3, " ": 1, "to": 2, " ": 1, "become": 6, " ": 1, "a": 1, " ": 1, "man": 3, " ": 1, "of": 2, " ": 1, "success,": 8, " ": 1, "but": 3] 
関連する問題