【发布时间】:2014-08-15 13:33:06
【问题描述】:
我一直在尝试了解如何使用 Swift 使用 Dictionary 和 Array 类型做一些简单的事情。
我首先尝试编写下面的简单函数来操作字符串列表并将它们存储到同一个数组中,当字符串是彼此的字谜时......!
这里的所有东西都应该在 Xcode 的 Playground 中运行。
问题:
- 为什么不能使用 toString() 将字符数组转换为字符串。我必须遍历字符数组并使用 += 构建字符串?
- 即时将数组添加到字典的最佳方法是什么,因为我发现字典对于该字符串索引是空的,因此我需要创建一个新数组来保存包含相同字母的字符串。关于 Dictionary 不包含您认为的类型但实际上包含 Type 的困惑? (即选项类型 - 在我的情况下为字符串?,可选字符串)。
请看下面的疯狂代码。
groupAnagrams(
listofWords: pass an array of String (immutable)
)
返回 字符串数组字典(分组字谜) 在字符串数组中执行的操作数的摘要 在字符串数组中执行的操作日志
目的 将作为字谜的单词分组到桶中 func 将创建一个以字符串为索引的字典,该字符串是字符的顺序字符串,例如 ["bats", "stab"] => ["abst" : ["rats", "stab"] ]
函数 charArrayToString
func charArrayToString(charArray ca: [Character]) -> String {
var s = ""
for c in ca {
s += String(c)
}
return s
}
func groupAnagrams(#listOfWords: [String]) -> [String:[String]] {
var s = ""
var d: [String:[String]] = [String:[String]]()
var i = 0, j = 0, k = 0
var log = [String]()
for s in listOfWords {
var s1:[Character] = [Character](s)
// var s1 = s
sort(&s1) { (a: Character, b: Character) -> Bool in return String(a) < String(b) }
//??? var s2 = toString(s1) // converts the Array of Character to a string (but it's for the for "[a,b,c,d]" and not "abcd" as you'd expect!
var s3 = charArrayToString(charArray: s1)
// Array already exists, add a string ELSE create the String array [String]() and add the fisst element
if let p = d[s3] {
// Array exists but d[s3] is "immutable" as it's optional array of String (type [String]?)
++i
var arr = d[s3]!
arr += [s]
d[s3] = arr
log += "Add string \(arr.count) \(s) to array \(s3) \n"
} else {
// ELSE: Create new String array
++j
d[s3] = [String]()
var arr = d[s3]!
arr += [s]
d[s3] = arr
log += "Create array for \(s3) with string \(s) \n"
}
++k
// break
}
var summary = [String]()
summary += ["\(i) strings added to already created arrays"]
summary += ["\(j) arrays created"]
summary += ["\(k) words processed"]
summary[0] // inspect
summary[1] // inspect
summary[2] // inspect
log // inspect
return d
}
// 与函数的数组版本相同,只是将字符串添加到函数的参数列表中
func groupAnagramsList(strings: String...) -> [String:[String]] {
return groupAnagrams(listOfWords: strings)
}
调用创建的各种函数:
var listOfWords = [String]() + ["bats", "star", "tree", "stab", "rats", "reet", "pong", "peel", "leep", "path", "type", "pyte", "ypte"]
var anagrams = groupAnagrams(listOfWords: listOfWords)
var otherWay = groupAnagramsList("bats", "star", "tree", "stab", "rats", "reet", "pong", "peel", "leep", "path", "type", "pyte", "ypte")
从 Swift Beta 5 更新:
if d[s3] == nil {
d[s3] = [String]()
++j
} else {
++i
}
d[s3]! += [s]
log += ["Add string \(d[s3]!.count) \(s) to array \(s3) \n"]
字典 d 上的 nil 检查是有效的!在这种情况下,复杂的可选/不可变行为消失了,代码更容易理解。 注意:我不得不改变
log += "将字符串 (d[s3]!.count) (s) 添加到数组 (s3) \n"
收件人:
log += ["将字符串 (d[s3]!.count) (s) 添加到数组 (s3) \n"]
因为您现在需要将字符串数组显式添加到字符串数组。您不能假设字符串上的 += 会将字符串附加到数组中。但这很简单,只需将字符串包裹在 '[' 和 ']' 中即可。
我仍然不知道为什么我不能将字符数组转换为字符串!
【问题讨论】:
标签: arrays dictionary swift optional