数组值的排序应类似于(字母、数字和特殊字符)
Posted
技术标签:
【中文标题】数组值的排序应类似于(字母、数字和特殊字符)【英文标题】:The array value should be sort like (alphabetic, numbers and special characters) 【发布时间】:2017-07-24 10:10:40 【问题描述】:我尝试对数组进行如下排序:
let students: Set = ["23412334","&234@fwv","Kofi", "Abena", "Peter", "Kweku", "Akosua"]
let sortedStudents = students.sorted()
print(sortedStudents)
输出:
["&234@fwv", "23412334", "Abena", "Akosua", "Kofi", "Kweku", "Peter"]
但我需要喜欢
["Abena", "Akosua", "Kofi", "Kweku", "Peter", "23412334","&234@fwv"]
【问题讨论】:
在排序的自然约定中,我认为这是不可能的。您需要编写自己的函数作为数组的扩展,然后使用它。 使用你定义了你自己的排序逻辑的闭包。 【参考方案1】:let words = ["23412334","&234@fwv","Kofi", "Abena", "Peter", "Kweku", "Akosua"]
func sortedNumbersLast(words: [String]) -> [String]
var startsWithDigit = [String]()
var startsWithCharacter = [String]()
var startsWithSymbol = [String]()
for word in words
if let first = word.characters.first
if first >= "0" && first <= "9"
startsWithDigit.append(word)
else
if(!(first >= "a" && first <= "z") && !(first >= "A" && first <= "Z") )
startsWithSymbol.append(word)
else
startsWithCharacter.append(word)
return startsWithCharacter.sorted(by: <) + startsWithDigit.sorted(by: <) + startsWithSymbol.sorted()
print(sortedNumbersLast(words: words))
["Abena", "Akosua", "Kofi", "Kweku", "Peter", "23412334", "&234@fwv"]
Modified Answer
【讨论】:
对不起朋友.....你能告诉我....如果我使用字典数组,怎么做像 PhoneNumbers = 5554787672; fullName = "丹尼尔·希金斯"; 【参考方案2】:“正确”的做法是定义您自己的排序比较器并使用sorted(by:)
,它使用您的比较器进行排序。在下面的示例中,我根据字符串中第一个字符的类别定义了一个“优先级”,然后是一个两级排序,首先基于优先级,然后是正常的字符串排序
extension String
enum Priority
case normal
case low
case lowest
static let lowPriority: Set<Character> = Set(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"])
static let lowestPriority: Set<Character> = Set(["&"])
static func < (a: Priority, b: Priority) -> Bool
switch (a, b)
case (.normal, .low), (.normal, .lowest), (.low, .lowest):
return true
default:
return false
var priority: Priority
let first = self.characters.first! // fatal error for empty strings
if Priority.lowestPriority.contains(first)
return .lowest
else if Priority.lowPriority.contains(first)
return .low
return .normal
let students: Set = ["23412334","&234@fwv","Kofi", "Abena", "Peter", "Kweku", "Akosua"]
let sortedStudents = students.sorted
(a, b) -> Bool in
if a.priority < b.priority
return true
else if b.priority < a.priority
return false
return a < b
print(sortedStudents)
可能仍然存在错误,但它适用于您的测试用例。
【讨论】:
朋友.....请帮助我....你能告诉我....如果我使用字典数组,如何做到这一点,如 PhoneNumbers = 5554787672; fullName = "丹尼尔·希金斯"; @joelprithivi 最好将其作为另一个问题提出。【参考方案3】:按照这些步骤进行
首先按照你已经排序的方式对数组进行排序。
删除以特殊字符开头的字符串并保存在另一个数组中。
删除以数字开头的字符串并将其保存在另一个数组中。 将数值数组附加到原始数组。 将特殊字符数组追加到原始数组中。【讨论】:
以上是关于数组值的排序应类似于(字母、数字和特殊字符)的主要内容,如果未能解决你的问题,请参考以下文章