【问题标题】:String Sorting Based on Last Character in SwiftSwift中基于最后一个字符的字符串排序
【发布时间】:2017-12-28 23:56:01
【问题描述】:

我想根据最后一个字符对字符串数组进行排序。这是我的字符串数组:

["c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2",
 "b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1"]

现在我想根据 最后一个下划线(_) 之后的最后一个值对这个数组进行排序。 有可能吗?

谢谢

【问题讨论】:

  • 最后一个下划线是否总是跟一个数字?或者它可以是多个数字或其他字符?如果是:它们应该如何排序,数字或字符串?如果满足条件相等怎么办? – 一个准确的问题陈述,涵盖所有可能的情况,总是一个好的开始。

标签: arrays swift string sorting


【解决方案1】:

sorted例如可以提供自定义排序条件(假设所有字符串都不为空)

let array = ["c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2", "b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1"]
let sortedArray = array.sorted { $0.substring(from: $0.index(before: $0.endIndex)) < $1.substring(from: $1.index(before: $1.endIndex)) }

Swift 3+ 语法更方便

let array = ["c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2", "b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1"]
let sortedArray = array.sorted { $0.suffix(1) < $1.suffix(1) }

【讨论】:

  • 我可以提一下,如果数组包含一个空字符串 ("") 会导致崩溃:fatal error: cannot decrement before startIndex
  • 是的,我知道我添加了一个假设,但似乎 OP 无论如何都想对非空字符串进行排序。
【解决方案2】:

Higher Order Function 的另一个答案:

  1. 反转Array 中的每个单词
  2. 然后,排序
let arr = ["c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2",
               "b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1"]

一行:

let returnValue = arr.map({String($0.reversed())}).sorted().map({String($0.reversed())})

多行:

let reverseEachWordsArr = arr.map { value in
    return String(value.reversed())
}

let finalCharSortArr = reverseEachWordsArr.sorted().map { word  in
    return String(word.reversed())
}
print(finalCharSortArr)

输出:

["b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1", 
 "c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2"]

【讨论】:

    【解决方案3】:

    毫无疑问。通过使用sorted(by:),您可以这样做:

    let myArray = ["c_572A267C-DAC8-487D-B1AF-719FE8E3A6AB_FF6E00_2",
                   "b_69E21DC6-431C-4373-B4F1-90BF7FB5462B_FFC000_1"]
    
    let sortedArray = myArray.sorted {
        guard let str1LastChar = $0.characters.last, let str2LastChar = $1.characters.last else {
            return false
        }
    
        return str1LastChar < str2LastChar
    }
    
    print(sortedArray)
    

    请注意,如果 myArray 包含任何空字符串 (""),则应按原样进行排序。

    【讨论】:

    • 但是(除非我又弄错了),还是有问题:与a="X", b="", c="Y": (a, b) 和( b, c) 是无与伦比的。那么 (a, c) 也一定是不可比较的,但它们不是。 – 返回false对称 条件对我来说总是很可疑。
    • 我想你的观点我现在很清楚,它类似于传递属性逻辑,对吧?排序["X", "", "Y"]的当前输出应该是相同的,没有编辑...
    • en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings 中称为“不可比性传递性”,并确保元素完全按&lt; 排序(其中“不可比性”元素为“相等”)——当然所有这些都只重要如果有个空字符串。
    • 啊,是的,马丁完全正确;为了使其正式有效,您需要对其进行更改,以便在将"" 与任何其他非空字符串进行比较时建立一些顺序。例如,使其排序少于任何其他非空字符串:switch ($0.characters.last, $1.characters.last) {case let (lhsLast?, rhsLast?): return lhsLast &lt; rhsLast case (_, nil): return false case (nil, _): return true }
    猜你喜欢
    • 1970-01-01
    • 2015-10-14
    • 2016-10-07
    • 2018-03-31
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多