gpt4 book ai didi

swift - 在名称数组中添加像字母一样的地址簿

转载 作者:行者123 更新时间:2023-11-30 12:19:37 24 4
gpt4 key购买 nike

我正在尝试选取一组人(目前仅用名字来简化),不仅对其进行排序,而且还在以该字母开头的所有人员前面添加第一个字母。

基本上是这样的:[“Daniel”,“Michael”,“Lisa”,“Lena”]应该变成这样:[“D”,“Daniel”,“L”,“Lena”,“Lisa”,“M ”,“迈克尔”]

我在 Playground 上有一些东西正在运行,但对我来说,这看起来很丑陋,并且不知道如果人们达到数千或更多,性能会如何。

//: 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 { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending }.forEach {
if $0.uppercased().characters.first! != previousName?.uppercased().characters.first! {
peopleWithLetters.append("\($0.uppercased().characters.first!)")
}
previousName = $0
peopleWithLetters.append($0)
}

任何关于如何简化或遵循最佳实践的想法都将受到高度赞赏。

最佳答案

这是函数式编程大放异彩的完美用例。

  • 将名称数组映射到首字母数组
  • 使用集合删除重复项
  • 将字母与名称组合
  • 对数组进行排序

这是代码:

//: Playground - noun: a place where people can play

func addSections(in words: [String]) -> [String] {
let sections = Set(words.map { String($0[$0.startIndex]) })
let wordsWithSections = words + sections
return wordsWithSections.sorted { $0 < $1 }
}

let names = ["Daniel", "Michael", "Lisa", "Lena"]
addSections(in: names)

尽管如果您计划使用此数组来提供 tableView(部分/行),那么最好使用您在评论中提到的字典。

关于swift - 在名称数组中添加像字母一样的地址簿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44956880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com