如何从最大减号开始对加减字符串进行排序?

问题描述 投票:0回答:2

我想对百分比数组字符串进行排序:

["-12.00%", "3.00%", "27.30%", "-8.37%"]

var array: [String]?
array = ["-12.00%", "3.00%", "27.30%", "-8.37%"]

我尝试将字符串转换为双精度,然后使用以下命令对其进行排序:

array.sorted(by: { Double($0.string ?? "") ?? 0.0 < Double($1.string ?? "") ?? 0.0 })
但是失败了

排序后我想要的结果是

["-12.00%", "-8.37%", "3.00%", "27.30%"]

如何按照我想要的结果排序,最大的减号在前面,最大的加号在最后?

arrays swift string sorting percentage
2个回答
0
投票

这可以通过以下过程来完成:

  1. 首先从每个 % 字符串中提取 num 值,然后
  2. 删除 '%' 字符,并将其转换为 Double。
  3. 然后,它会考虑百分比的符号来比较数值,以实现所需的排序顺序。

代码:

let percentages = ["-12.00%",  "3.00%", "27.30%", "-8.37%"]

let sortedPercentages = percentages.sorted { (str1, str2) -> Bool in

guard let value1 = Double(str1.dropLast().replacingOccurrences(of: "%", with: "")),
      let value2 = Double(str2.dropLast().replacingOccurrences(of: "%", with: "")) else {
    return false 
}


if value1 < 0 && value2 < 0 {
    return value1 > value2 
} else if value1 >= 0 && value2 >= 0 {
    return value1 < value2 
} else {
    return value1 < value2 // negative values then positive values
}
}
print(sortedPercentages)

输出:["-12.00%", "-8.37%", "3.00%", "27.30%"]


0
投票

“%”符号可能导致问题。如果它始终是最后一个字符,那么您可以使用

.dropLast()
将其删除。

然后函数

.sorted
返回一个新数组,它不会对数组原位进行排序。

假设您从字符串数组开始,以下是如何将这些更改应用于您最初的尝试:

let array = ["-12.00%", "3.00%", "27.30%", "-8.37%"]
let sortedArray = array.sorted {
    (Double($0.dropLast()) ?? 0.0) < (Double($1.dropLast()) ?? 0.0)
}
print(sortedArray)
["-12.00%", "-8.37%", "3.00%", "27.30%"]
© www.soinside.com 2019 - 2024. All rights reserved.