我正在尝试查找从文件中读取的单词列表中是否有字符串。这就是我目前所拥有的。内容呢?[索引]似乎确实有效。但是循环/可选的东西导致事情不起作用。
还有一个效率问题。把一张单子放进字典里,把钥匙放在第一个字母或别的什么东西上面,这样更好吗?然后尝试查看该对象是否存在相同的密钥,而不是每次循环遍历整个列表。

      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?而不是智力。谢谢你对如何做到最好的建议。

最佳答案

我认为问题出在这里:

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更好的算法如下:
将所有密钥存储在哈希集中。循环浏览所有单词,检查单词是否在集合中,如果是,则添加到找到的单词列表中。简单多了。
如果单词的数量小于键的数量,我将通过填充单词列表中的哈希集并循环键来反转它。
该算法的复杂度最多应为O(2n),其中n是密钥数目与单词数目之间的最大值。

关于swift - 快速遍历列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24726778/

10-12 14:30
查看更多