数组值的排序应类似于(字母、数字和特殊字符)

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", "&amp;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】:

按照这些步骤进行

首先按照你已经排序的方式对数组进行排序。

删除以特殊字符开头的字符串并保存在另一个数组中。

删除以数字开头的字符串并将其保存在另一个数组中。 将数值数组附加到原始数组。 将特殊字符数组追加到原始数组中。

【讨论】:

以上是关于数组值的排序应类似于(字母、数字和特殊字符)的主要内容,如果未能解决你的问题,请参考以下文章

JS sort() 按照某个属性对数组进行排序

linux -sort_wc_uniq命令

用java自动生成口令由数字、大小写字母及特殊字符,且至少包含其中两种字符

http请求特殊字符转码

正则表达式仅查找数字+文本的字母数字组合,无特殊

正则表达式必须包含字母数字和特殊字符