Arrays 在swift中对时间字符串范围列表进行排序

Arrays 在swift中对时间字符串范围列表进行排序,arrays,swift,Arrays,Swift,字符串数组中总共有9个元素 strArr = [ "1 days ago","10 hours ago","2 hours ago","3 days ago","3 hours ago","4 hours ago", "5 hours ago","6 hours ago","7 hours ago"] 我需要像这样对数组进行排序 sortedArr = ["2 hours ago","3 hours ago","4 hours ago","5 hours ago", "6 hours ago"

字符串数组中总共有9个元素

strArr = [ "1 days ago","10 hours ago","2 hours ago","3 days ago","3 hours ago","4 hours ago",
"5 hours ago","6 hours ago","7 hours ago"]
我需要像这样对数组进行排序

sortedArr = ["2 hours ago","3 hours ago","4 hours ago","5 hours ago",
"6 hours ago","7 hours ago","10 hours ago", "1 days ago","3 days ago"]
您可以通过3个步骤完成此操作:

  • 创建表示句子的模型值
  • 使模型值具有可比性
  • 将每个句子转换为模型值
  • 对模型值进行排序
  • 再次将每个模型值转换为一个句子

  • 步骤1:创建一个模型值来表示一个句子,如果字符串集合是一致的,则只需传递一个自定义排序谓词即可。如果前一个元素有小时后缀,而下一个元素不只是返回true,否则返回
    localizedStandardCompare
    结果

    let strings = [ "1 days ago","10 hours ago","2 hours ago","3 days ago","3 hours ago","4 hours ago",
    "5 hours ago","6 hours ago","7 hours ago"]
    
    let sorted = strings.sorted{ $0.hasSuffix(" hours ago") && !$1.hasSuffix(" hours ago") ? true : $0.localizedStandardCompare($1) == .orderedAscending  }
    print(sorted) // ["2 hours ago", "3 hours ago", "4 hours ago", "5 hours ago", "6 hours ago", "7 hours ago", "10 hours ago", "1 days ago", "3 days ago"]
    

    这将是相当困难的,尤其是w.r.t.本地化。你从哪里获取这些数据?@Alexander:我们从API获取这些数据是基于我们如上所述创建的唯一密钥数组。你不应该使用字符串。您应该使用时间戳。这些很容易分类(或过滤或其他)。除非向用户显示相对时间戳,否则不要使用此类字符串。NLP可以像处理符咒一样处理它,但这有点超出了您的问题范围。这是从API获取数据的唯一方法吗?如果你能得到时间戳,然后在排序后根据需要对它们进行格式化,你会有一个更轻松的时间。虽然这样做有效,但它解决了错误的问题。这种方法实际上无法扩展(跨多个不同的短语类型和不同的语言)。如果有可能获得更理智的输入数据,我建议将此作为最后手段。嗨@Alexander,是的,没错。我的解决方案是根据问题提供的数据集类型定制的。不幸的是,我没有一个更通用的解决方案。很酷,基本上与我在回答中使用的逻辑相同,但只需要一小部分我需要的代码。向上投票。