我有一个字符串数组,示例如下:
"0.125-0.25"
"1-2"
"50-100"
"100-200"
对它们进行排序的结果是:
"0.125-0.25"
"1-2"
"100-200"
"50-100"
如果我将(“ 1000-2000”)附加到数组,然后对其进行排序,则将是:
"0.125-0.25"
"1-2"
"100-200"
"1000-2000"
"50-100"
但是我想要的是:
"0.125-0.25"
"1-2"
"50-100"
"100-200"
"1000-2000"
这绝对是个优势,但我一直靠自己过运。谢谢大家。
答案 0 :(得分:1)
一个有效但不是非常有效的解决方案是提取字符串范围内的第一个Double值并对其进行排序。这是非常低效的,因为在每次调用闭包时都必须重新创建两个Double值。
<div class="container">
<div class="row">
<div class="col-sm-12">
<div class="block">
<label class="checkbox"> This is my checkbox
<input type="checkbox" data-toggle="collapse" data-target="#collapseExample">
</label>
<div class="collapse" id="collapseExample">
<div class="row">
<div class="col-12">
<div class="form-group">
<input type="number" class="form-control" placeholder="option one">
</div>
<div class="form-group">
<input type="number" class="form-control" placeholder="option two">
</div>
<div class="form-group">
<input type="number" class="form-control" placeholder="option three">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
一种更有效的解决方案是将数组(一次)映射到其第一个Double值,然后.block {
margin-top: 30px;
}
.collapse {
background-color: #eee;
padding: 30px 15px;
}
两个数组,将组合后的数组按Double数组排序,然后将结果映射回字符串范围数组。
var array = ["1-2", "50-100", "0.125-0.25", "100-200"]
array.append("1000-2000")
let sortedArray = array.sorted { (str1, str2) -> Bool in
func firstDouble(of string: String) -> Double { return Double(string.components(separatedBy: "-").first!)! }
return firstDouble(of: str1) < firstDouble(of: str2)
}
print(sortedArray)
答案 1 :(得分:1)
您正在排序的Double
范围很广,因此可以通过创建一个中间对象来澄清问题。
struct DoubleRange: Comparable {
let start: Double
let end: Double
init(string: String) {
let components = string.split(separator: "-")
start = Double(components[0])! // Be careful with `!` here, I'm assuming the format is always correct
end = Double(components[1])!
}
var stringValue: String {
return "\(start)-\(end)"
}
static func < (lhs: DoubleRange, rhs: DoubleRange) -> Bool {
return lhs.start < rhs.start
}
}
然后排序很简单...
var array = ["1-2", "50-100", "0.125-0.25", "100-200"]
array.append("1000-2000")
array.map(DoubleRange.init).sorted().map{$0.stringValue}
// ["0.125-0.25", "1.0-2.0", "50.0-100.0", "100.0-200.0", "1000.0-2000.0"]
如果您始终想转换回字符串值,则可以添加…
extension Array where Element == String {
func sortedDoubleRange() -> [String] {
return array.map(DoubleRange.init).sorted().map{$0.stringValue}
}
}
array.sortedDoubleRange()
请注意这一点……如果任何字符串的格式不正确,它将崩溃。