在Xcode(Swift)中,我有一个初始化为100个空项的数组:
var persons = [String](count:100, repeatedValue: "")
使用某些函数,我将内容添加到数组中的位置,从0开始。
所以例如我的数组在某个特定时刻:
["Bert", "Daniel", "Claire", "Aaron", "", "", ... ""]
用点表示其余的空项目。我使用此函数按字母顺序对数组进行排序:
persons = persons.sorted {$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
这给了我一个像这样的数组:
["", "", ... , "Aaron", "Bert", "Claire", "Daniel"]
我想要的是按字母顺序对数组进行排序,而不是使用前面的空项目。我需要得到一个数组:
["Aaron", "Bert", "Claire", "Daniel", "", "", ... , ""]
就我而言,我不想要一个带有空项目的数组,但是我发现如果我没有声明像100个项目那么我就无法为我的数组添加一个值(数组不会被填充到100个项目,这是肯定的。)
任何人都可以帮助我吗?
答案 0 :(得分:6)
正如@Antonio所说,看起来你需要一个降序 set 的字符串。除了@ Antonio的答案中的Dictionary
方法(效果很好),你也可以使用NSMutableSet
(来自Objective-C的桥接):
let personSet = NSMutableSet()
personSet.addObject("Aaron")
personSet.addObject("Daniel")
personSet.addObject("Claire")
personSet.addObject("Aaron")
personSet.addObject("Bert")
personSet.addObject("Bert")
personSet.addObject("Joe")
personSet.removeObject("Joe") // You can remove too of course
创建集合:
{(
Claire,
Aaron,
Daniel,
Bert
)}
然后,当您希望人们成为Array
时,您可以使用allObjects
强制转换为[String]
:
personSet.allObjects as [String]
你可以像你现在一样对它进行排序:
let people = (personSet.allObjects as [String]).sort {$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
这使得people
:
[Aaron, Bert, Claire, Daniel]
对于那些想知道如何对问题中最初陈述的Array
进行排序(升序但最后用空字符串)的人,可以使用sort函数中的一些自定义逻辑来完成:
var persons = ["Bert", "Daniel", "Claire", "Aaron", "", "", ""]
persons.sort { (a, b) -> Bool in
if a.isEmpty {
return false
} else if b.isEmpty {
return true
} else {
return a.localizedCaseInsensitiveCompare(b) == .OrderedAscending
}
}
结果:
["Aaron", "Bert", "Claire", "Daniel", "", "", ""]
答案 1 :(得分:2)
在您的问题和其他答案中阅读评论,我意识到您需要一个包含唯一值的有序集。在swift中没有内置的数据结构,但是可以通过使用字典轻松完成:只需使用字符串值作为字典键,使用布尔值作为字典值 - 这可以确保键是唯一的:
var persons = [String : Bool]()
persons["Bert"] = true
persons["Daniel"] = true
persons["Clair"] = true
persons["Clair"] = true
persons["Aaron"] = true
persons["Daniel"] = true
persons["Clair"] = true
您可以使用上面的代码快速验证字典是否仅包含4个元素。
接下来,获取字典键的副本(作为数组):
var values = persons.keys.array
并对其进行排序:
values.sort { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
或者,如果您想坚持使用固定大小的数组,则可以在排序前删除空项:
persons = persons
.filter( { $0.isEmpty == false } )
.sorted {$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
答案 2 :(得分:2)
我认为你对数组感到困惑。 Swift数组不是静态分配的结构,必须分配并填充到最大设计容量。下面是一个粗略的例子,说明如何完成你在这里表达的大部分内容。但是,我真的认为字典更适合您的需求。
var persons = [String]()
var inputData = ["Bert", "Daniel", "Bert", "Claire", "Aaron"]
for item in inputData {
var found = false
for existing in persons {
if existing == item {
found = true
break
}
}
if (!found) {
persons.append(item)
}
}
persons.sort{$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
println(persons)