Swift循环列表

时间:2014-07-13 20:26:21

标签: 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}
      }

它抱怨计数是一个int?而不是一个int。感谢有关如何最好地工作的建议。

1 个答案:

答案 0 :(得分:5)

我认为问题在于:

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是键数和单词数之间的最大值。