在名称数组中添加地址簿,如字母

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),您最好使用您在评论中提到的字典。