2014-07-13 46 views
0

我試圖找到一個字符串是否在從文件中讀取的單詞列表中。這是我迄今爲止所擁有的。內容?[索引]似乎工作。但循環/可選的東西導致事情不起作用。Swift循環遍歷列表

此外,還有一個效率問題。把一個列表放在字典裏,並且把第一個字母或其他東西放在鍵上可能會更好嗎?然後嘗試使用相同的密鑰來查看該對象是否存在,而不是每次循環遍歷整個列表。

 let testString = "Hello"  

     let path = NSBundle.mainBundle().pathForResource("wordlist", ofType: "txt") 
     var content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)?.componentsSeparatedByString("\n") 

     let count = content?.count 

     for word in 0..<count 
     { 
     if testString == content?[word]{ 
     // fount word} 
     } 

它抱怨count是int嗎?而不是int。感謝有關如何最好地工作的建議。

回答

4

我認爲這個問題是在這裏:

let count = content?.count 

這是一個可選的(Int?)。解決方法是用條件解包:

if let count = content?.count { 
    for word in 0..<count 
     { 
      if testString == content?[word] { 
       // fount word} 
     } 
    } 
} 

至於算法,它取決於用法。如果你只進行一次搜索,那麼當前的實現是好的,這是一個O(n)。

在多次搜索的情況下,我會用這個算法:

  • 排序的所有鍵
  • 排序的所有單詞
  • 然後依次通過兩個
  • 比較字鍵:
    • 如果相等,則找到1個詞,提前鍵並繼續循環
    • 如果更少,提前詞並繼續
    • 如果更大,推進重點,繼續
  • 循環結束時,或者沒有其他按鍵或沒有其他字可用。

不確定,但複雜性應該是O(N),加上排序2個列表的成本。

補遺實現一個循環更好的方法是:

if let content = content { 
    for word in 0 ..< content.count 
    { 
     if testString == content[word] { 
      // fount word} 
     } 
    } 
} 

展開一次,在任何地方使用(但塊內)。

附錄2更好的算法如下:

商店都在一個HashSet鍵。遍歷所有單詞,檢查單詞是否在集合中,如果是,則添加到找到的單詞列表中。簡單得多。

如果單詞的數量少於按鍵的數量,我會通過填充單詞列表中的哈希集並循環遍歷按鍵來反轉。

該算法的複雜度應該至多爲O(2n),其中n是密鑰數量和字數之間的最大值。

+0

這解決了我的循環問題,但它似乎有與平等測試問題。它找不到列表中的單詞。 VAR的TestString = 「HELLO」 如果讓計數=內容?.Count之間{ 在0字.. <計數 { 如果的TestString ==內容?[字] .uppercaseString || testString == content?[word] .lowercaseString {「找到的單詞:\(testString)」) } } } println(「要測試的字符串\(testString)和\(content?[3]。大寫字符串)「) –

+0

如果我直接指定testString說內容[3]它找到匹配,但不是如果我只是手動輸入字符串。 –

+0

你使用非ASCII字符嗎?比較之前您是否嘗試過修剪?嘗試閱讀本博客文章,看看它是否適用於您的情況:http://oleb.net/blog/2014/07/swift-strings/ – Antonio