我正在尝试查找字符串是否在从文件中读取的单词列表中。这就是我到目前为止所拥有的。内容?[索引]似乎确实有效。但循环/可选的东西导致事情不起作用。
此外,还有一个效率问题。是否可以更好地将列表放入字典并将键作为首字母或其他内容?然后尝试查看该对象是否存在相同的密钥,而不是每次循环遍历整个列表。
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。感谢有关如何最好地工作的建议。
答案 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)。
如果是多次搜索,我会使用这个算法:
不确定,但复杂性应该是O(N),再加上对2个列表进行排序的成本。
附录实现该循环的更好方法是:
if let content = content {
for word in 0 ..< content.count
{
if testString == content[word] {
// fount word}
}
}
}
展开一次并在任何地方使用(但在街区内)。
附录2 更好的算法如下:
将所有密钥存储在哈希集中。遍历所有单词,检查单词是否在集合中,如果是,则添加到找到的单词列表中。更简单。
如果单词的数量小于键的数量,我会通过从单词列表中填充哈希集并循环键来反转它。
此算法的复杂性最多为O(2n),其中n是键数和单词数之间的最大值。