首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同时按字符串日期和布尔IOS对对象数组进行排序

同时按字符串日期和布尔IOS对对象数组进行排序
EN

Stack Overflow用户
提问于 2017-02-16 00:59:53
回答 2查看 1K关注 0票数 0

我正在尝试对一个对象数组进行排序,该对象数组在"MM-DD-YYYY“的from中有一个字符串日期字段和一个布尔值字段。我想创建一个同时按日期字段和布尔值字段对数组进行排序的函数。我很难弄清楚该怎么做。done字段默认设置为false,并且在我的init函数中不需要。

代码语言:javascript
运行
复制
var items = [BucketItem(title: "blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-14-2017"),BucketItem(title: "blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-11-2017"), BucketItem(title: "blah blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-9-2017")]

我研究了.sort函数,但我不知道如何比较日期,因为它们是字符串格式的,我也不知道如何按两个字段而不是一个字段排序。我想要排序,以便如果布尔值为true,则它自动小于布尔值字段为false的项。如果两个布尔值都为false,则按日期排序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-16 01:30:45

我将创建一个Dateinternal扩展,它定义了一个接受字符串的初始化器,并将其解析为Date。您可以在整个模块中使用它来根据项目选择的日期字符串格式来解析日期。

代码语言:javascript
运行
复制
import Foundation

internal extension Date {
    init(_ s: String) {
        let df = DateFormatter()
        df.dateFormat = "MM-d-yyyy"
        guard let date = df.date(from: s) else {
            fatalError("Invalid date string.")
        }
        self.init(timeIntervalSince1970: date.timeIntervalSince1970)
    }
}

然后,我将修改您的结构以存储Date,而不是String。当然,修改初始化器以匹配。

代码语言:javascript
运行
复制
let items = [
    BucketItem(
        title: "blah",
        des: "description",
        lat: 134.6, lon: 27.0,
        date: Date("02-14-2017")
    ),
    BucketItem(
        title: "blah",
        des: "description",
        lat: 134.6, lon: 27.0,
        date: Date("02-11-2017")
    ),
    BucketItem(
        title: "blah blah",
        des: "description",
        lat: 134.6, lon: 27.0,
        date: Date("02-9-2017")
]

在这里,您拥有了Comparable Date实例,您可以在排序中使用这些实例。要了解如何根据多个条件进行排序,请参阅my answer here。下面是粗略的代码:

代码语言:javascript
运行
复制
extension BucketItem: Equatable {
    static func ==(lhs: BucketItem, rhs: BucketItem) -> Bool {
        return lhs.isDone == rhs.isDone
            && lhs.date == rhs.date
            // && lhs.foo == rhs.foo
            // ...and so on, for all criteria that define equality of two BucketItems
    }
}

func <(lhs: Bool, rhs: Bool) -> Bool {
    return !lhs && rhs // false is less than true
}

extension BucketItem: Comparable {
    static func <(lhs: BucketItem, rhs: BucketItem) -> Bool {
        // First sort by isDone
        if (lhs.isDone != rhs.isDone) { return lhs.isDone < rhs.isDone }
        // else if (lhs.foo != rhs.foo) { return lhs.foo < rhs.foo }
        // ...and so on, for all sort criteria
        else (lhs.date != rhs.date) { return lhs.date < rhs.date }
    } 
}

letsortedItems = items.sorted()
票数 2
EN

Stack Overflow用户

发布于 2017-02-16 01:48:44

您可以将BucketItem定义为

代码语言:javascript
运行
复制
struct BucketItem {
let title: String
let des: String
let lat: Double
let lon: Double
let dat: String
let someBoolValue : Bool
var date: NSDate {
    get {
        return BucketItem.dateFormatter.dateFromString(dat)!
    }
}
static let dateFormatter: NSDateFormatter = {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "MM-dd-yyyy"
    return formatter
    }()

}

然后在数组上调用排序方法

代码语言:javascript
运行
复制
 var items = [BucketItem(title: "blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-14-2017", someBoolValue: false),BucketItem(title: "blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-11-2017", someBoolValue :true), BucketItem(title: "blah blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-9-2017",someBoolValue: false),  BucketItem(title: "blah blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-9-2017",someBoolValue: true)]
    items.sortInPlace{
        if $0.date != $1.date {
            return $0.date.compare($1.date) == NSComparisonResult.OrderedAscending
        }
        else {
            return !$0.someBoolValue && $1.someBoolValue
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42255683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档