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