【问题标题】:Sorting a tuple array of Strings that contains a date in Swift 3?在 Swift 3 中对包含日期的字符串元组数组进行排序?
【发布时间】:2017-07-30 19:10:52
【问题描述】:

我目前有一个元组数组,它​​的第一个值是String 类型,第二个值是Double 类型。第一个值包含日期,格式为"MM/dd/yy"

由于我的代码冲突,我没有使用 Date 对象。

由于MM,我无法按字符串按降序(从最近到最旧)对该数组进行排序。

例如,我的数组包含以下内容:

[("07/30/17", 5.0), ("08/30/17", 9.0), ("05/30/17", 5.0), ("05/28/17", 6.0)]

调用tupleArray = tupleArray.sort( {$0.0 > $1.0} ) 会产生以下结果:

[("08/30/17", 9.0), ("07/30/17", 5.0), ("05/30/17", 5.0), ("05/28/17", 6.0)]

按预期工作。

但是,如果我添加一个 String 条目 "08/30/16",调用相同的排序函数会产生以下结果:

[("08/30/17", 9.0), ("08/30/16", 30.0), ("07/30/17", 5.0), ("05/30/17", 5.0), ("05/28/17", 6.0)]

"08/30/16" 在应该是最后一个索引时位于第二个索引中,因为年份 1617 更早。

我看过:

  1. (Swift 3) Trying to sort an array of class objects by Date in swift 3?

  2. Sort Objects in Array by date

我做错了什么?

谢谢!

【问题讨论】:

  • 对日期字符串进行排序既丑陋又麻烦。考虑面向对象,而不是元组,使用具有存储的Date(是的!)属性和用于字符串表示的计算属性的自定义结构或类。它让生活更轻松。
  • @vadian 我明白,但使用替代Date 不适用于我当前的实现...有没有更好的解决方案来排序日期Strings 然后切换到Date对象?
  • 然后考虑改变你的实现。不要与框架抗争。
  • 您可以为您的特定日期字符串表示编写自己的自定义排序逻辑,但正如@vadian 之前所说,更改您的实现以使用Date 对象是更容易和更好的解决方案。

标签: ios arrays swift


【解决方案1】:
import Foundation

var tupleArray = [("08/30/17", 9.0), ("08/30/16", 30.0), ("07/30/17", 5.0), ("05/30/17", 5.0), ("05/28/17", 6.0)]

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yy"

tupleArray = tupleArray.sorted { 
    guard let date1 = dateFormatter.date(from:$0.0), let date2 = dateFormatter.date(from:$1.0) else { return false}
    return date1 > date2
}

print(tupleArray)

【讨论】:

    【解决方案2】:

    我建议您创建一个Object,它将您的StringDouble 作为属性。您可以将 Data 作为计算属性,该属性将根据 String 值进行计算。并使用Date 计算属性进行排序。

    我相信这将使您的生活更加轻松,并将您的代码从元组重写为对象。稍后在对字符串进行排序时很难找到错误。我敢肯定,当数组中有 3 个元组时,您的第一个案例只是巧合,它以正确的方式对其进行了排序(这是一个猜测) ..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      相关资源
      最近更新 更多