在名称数组中添加地址簿,如字母
Add address book like letters in array of names
我正在尝试获取一组人(现在只用名字简化),不仅要对其进行排序,还要在所有以该字母开头的人前面添加第一个字母。
基本上是这样的:["Daniel"、"Michael"、"Lisa"、"Lena"] 应该变成这样:["D"、"Daniel"、 "L"、"Lena"、"Lisa"、"M"、"Michael"]
我有一些东西在操场上工作,但对我来说这看起来很难看,如果人们达到数千或更多,我不知道性能如何。
//: Playground - noun: a place where people can play
import Cocoa
var previousName: String?
let people = ["Martin", "Michael", "Lisa", "Lena", "Dirk"]
var peopleWithLetters: [String] = []
people.sorted { [=10=].localizedCaseInsensitiveCompare() == ComparisonResult.orderedAscending }.forEach {
if [=10=].uppercased().characters.first! != previousName?.uppercased().characters.first! {
peopleWithLetters.append("\([=10=].uppercased().characters.first!)")
}
previousName = [=10=]
peopleWithLetters.append([=10=])
}
任何关于如何简化或遵循最佳实践的想法都将不胜感激。
这是函数式编程大放异彩的完美用例。
- 将名称数组映射到首字母数组
- 使用集合删除重复项
- 将字母与名字组合起来
- 对数组进行排序
代码如下:
//: Playground - noun: a place where people can play
func addSections(in words: [String]) -> [String] {
let sections = Set(words.map { String([=10=][[=10=].startIndex]) })
let wordsWithSections = words + sections
return wordsWithSections.sorted { [=10=] < }
}
let names = ["Daniel", "Michael", "Lisa", "Lena"]
addSections(in: names)
尽管如果您计划使用此数组来提供 tableView (sections/rows),您最好使用您在评论中提到的字典。
我正在尝试获取一组人(现在只用名字简化),不仅要对其进行排序,还要在所有以该字母开头的人前面添加第一个字母。
基本上是这样的:["Daniel"、"Michael"、"Lisa"、"Lena"] 应该变成这样:["D"、"Daniel"、 "L"、"Lena"、"Lisa"、"M"、"Michael"]
我有一些东西在操场上工作,但对我来说这看起来很难看,如果人们达到数千或更多,我不知道性能如何。
//: Playground - noun: a place where people can play
import Cocoa
var previousName: String?
let people = ["Martin", "Michael", "Lisa", "Lena", "Dirk"]
var peopleWithLetters: [String] = []
people.sorted { [=10=].localizedCaseInsensitiveCompare() == ComparisonResult.orderedAscending }.forEach {
if [=10=].uppercased().characters.first! != previousName?.uppercased().characters.first! {
peopleWithLetters.append("\([=10=].uppercased().characters.first!)")
}
previousName = [=10=]
peopleWithLetters.append([=10=])
}
任何关于如何简化或遵循最佳实践的想法都将不胜感激。
这是函数式编程大放异彩的完美用例。
- 将名称数组映射到首字母数组
- 使用集合删除重复项
- 将字母与名字组合起来
- 对数组进行排序
代码如下:
//: Playground - noun: a place where people can play
func addSections(in words: [String]) -> [String] {
let sections = Set(words.map { String([=10=][[=10=].startIndex]) })
let wordsWithSections = words + sections
return wordsWithSections.sorted { [=10=] < }
}
let names = ["Daniel", "Michael", "Lisa", "Lena"]
addSections(in: names)
尽管如果您计划使用此数组来提供 tableView (sections/rows),您最好使用您在评论中提到的字典。