斯威夫特:对一个或多或少数字的字符串数组进行排序

时间:2018-08-22 06:54:01

标签: arrays swift string sorting

我有一个字符串数组,示例如下:

"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"

这绝对是个优势,但我一直靠自己过运。谢谢大家。

2 个答案:

答案 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()

请注意这一点……如果任何字符串的格式不正确,它将崩溃。