简体   繁体   English

在Swift中对字典进行排序

[英]Sort Array of dictionary in Swift

I am getting an array from response as below 我从响应中获取数组如下

  items=[{
         "displayName": "Adam Codo",
         "postedTime": "2011-04-04T21:31:20.000Z",
         "message" : "Hello Test Message"
         },
         {
         "displayName": "Leena",
         "postedTime": "2011-04-04T20:32:20.000Z",
         "message" : " Start Hello Test Message"
         },
         {
         "displayName": "Zohn",
         "postedTime": "2011-04-03T22:47:20.000Z",
         "message" : "Hi Leena"
         },
         {
         "displayName": "Leena",
         "postedTime": "2011-04-04T21:32:20.000Z",
         "message" : " Start Hello Test Message"
         },
         {
         "displayName": "Adam Codo",
         "postedTime": "2011-04-04T22:13:10.000Z",
         "message" : "Hello Test Message"
         }]

I have so sort the array by the name & later by the time. 我已经按名称对数组进行排序,之后又按时间对数组进行了排序。 so I need sorted array like below 所以我需要像下面这样的排序数组

  items=[
         {
         "displayName": "Adam Codo",
         "postedTime": "2011-04-04T22:13:10.000Z",
         "message" : "Hello reply Test Message"
         },
         {
         "displayName": "Adam Codo",
         "postedTime": "2011-04-04T21:31:20.000Z",
         "message" : "Hello Test Message"
         },
         {
         "displayName": "Leena",
         "postedTime": "2011-04-04T21:32:20.000Z",
         "message" : " Start Hello Test Message"
         },
         {
         "displayName": "Leena",
         "postedTime": "2011-04-04T20:32:20.000Z",
         "message" : " Start Hello Test Message"
         },
         {
         "displayName": "Zohn",
         "postedTime": "2011-04-03T22:47:20.000Z",
         "message" : "Hi Leena"
         }
]

Can anyone suggest me how to do this? 谁能建议我该怎么做? Any idea would be great. 任何想法都很棒。

Do NOT use dictionaries 不要使用字典

Build your own model instead and life will be easier. 相反,建立自己的模型,生活会更轻松。

Here's the model 这是模特

struct Element {
    let displayName: String
    let postedTime: Date
    let message: String

    init?(dict:[String:String]) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
        guard
            let displayName = dict["displayName"],
            let timeText = dict["postedTime"],
            let postedTime = dateFormatter.date(from: timeText),
            let message = dict["message"]
            else { return nil }

        self.displayName = displayName
        self.postedTime = postedTime
        self.message = message
    }
}

Now let's make it Comparable 现在让它变得Comparable

extension Element: Comparable {

    static func <(lhs: Element, rhs: Element) -> Bool {
        if lhs.displayName != rhs.displayName {
            return lhs.displayName < rhs.displayName
        }
        return lhs.postedTime < rhs.postedTime
    }

    static func ==(lhs: Element, rhs: Element) -> Bool {
        return lhs.displayName == rhs.displayName && lhs.postedTime < rhs.postedTime
    }

}

Now given your array of dictionaries 现在给出您的字典数组

let items = [
    [
        "displayName": "Adam Codo",
        "postedTime": "2011-04-04T21:31:20.000Z",
        "message" : "Hello Test Message"
    ],
    [
        "displayName": "Leena",
        "postedTime": "2011-04-04T20:32:20.000Z",
        "message" : " Start Hello Test Message"
    ],
    [
        "displayName": "Zohn",
        "postedTime": "2011-04-03T22:47:20.000Z",
        "message" : "Hi Leena"
    ],
    [
        "displayName": "Leena",
        "postedTime": "2011-04-04T21:32:20.000Z",
        "message" : " Start Hello Test Message"
    ],
    [
        "displayName": "Adam Codo",
        "postedTime": "2011-04-04T22:13:10.000Z",
        "message" : "Hello Test Message"
    ]
]

we can convert it to an array of Element(s) and finally sorting it 我们可以将其转换为一个元素数组,最后对其进行排序

let sortedElms = items.flatMap(Element.init).sorted()

Result 结果

[
    Element(displayName: "Adam Codo", postedTime: 2011-04-04 21:31:20 +0000, message: "Hello Test Message"),
    Element(displayName: "Adam Codo", postedTime: 2011-04-04 22:13:10 +0000, message: "Hello Test Message"),
    Element(displayName: "Leena", postedTime: 2011-04-04 20:32:20 +0000, message: " Start Hello Test Message"),
    Element(displayName: "Leena", postedTime: 2011-04-04 21:32:20 +0000, message: " Start Hello Test Message"),
    Element(displayName: "Zohn", postedTime: 2011-04-03 22:47:20 +0000, message: "Hi Leena")
]
var sortedResults = items.sorted {
          (dictOne, dictTwo) -> Bool in 

    if dictOne["displayName"]! != dictTwo["displayName"]! {
            return dictOne["displayName"]! < dictTwo["displayName"]!
        }

        return dictOne["postedTime"]! < dictTwo["postedTime"]!
        };
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey: @"displayName" ascending: YES];

NSArray *sortedArray = [_locations sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

NSArray *sortedLocations = [_locations sortedArrayUsingComparator: ^(NSDictionary *d1, NSDictionary *d2) {
    ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
    NSDate *theDate1 = [formatter dateFromString:[d1 valueForKey:@"postedTime"]];
    NSDate *theDate2 = [formatter dateFromString:[d2 valueForKey:@"postedTime"]];
    return [theDate1 compare:theDate2];
}];

OR 要么

NSArray *sortedLocations = [_locations sortedArrayUsingComparator: ^(NSDictionary *d1, NSDictionary *d2) {

    ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
    NSDate *theDate1 = [formatter dateFromString:[d1 valueForKey:@"postedTime"]];
    NSDate *theDate2 = [formatter dateFromString:[d2 valueForKey:@"postedTime"]];

    NSString *name1 = [d1 valueForKey:@"displayName"];
    NSString *name2 = [d2 valueForKey:@"displayName"];

    if ([name1 compare:name2]) {
        return [theDate1 compare:theDate2];
    }


    return NSOrderedDescending;
}];

But be awere I did not check it 但是请问我没有检查

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM