按两个属性对对象数组进行排序 [英] Sort array of objects by two properties

查看:293
本文介绍了按两个属性对对象数组进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用NSSortDescriptor之前,这很容易被问到并回答.但是是否有使用Array.sort()的Swift标准方式?

This has been asked and answered before using NSSortDescriptor where it is quite easy. But is there a Swift-standard way using Array.sort()?

struct Sortable {
    let isPriority: Bool
    let ordering: Int
}

通过一个属性对Sortables数组进行排序很简单:

Sorting an array of Sortables by one property is simple:

sort { $0.ordering < $1.ordering }

但是我想按isPriority然后按ordering进行排序-而且我无法理解一个简单的语句来实现这一目标.

But I want to sort by isPriority then by ordering - and I can't get my head around a simple statement to make that happen.

推荐答案

是的,使用Array.sort()

代码:

var sorted = array.sorted({ (s1, s2) -> Bool in
    if s1.isPriority && !s2.isPriority {
        return true //this will return true: s1 is priority, s2 is not
    }
    if !s1.isPriority && s2.isPriority {
        return false //this will return false: s2 is priority, s1 is not
    }
    if s1.isPriority == s2.isPriority {
        return s1.ordering < s2.ordering //if both save the same priority, then return depending on the ordering value
    }
    return false
})

排序后的数组:

true - 10
true - 10
true - 12
true - 12
true - 19
true - 29
false - 16
false - 17
false - 17
false - 17
false - 18

另一个更短的解决方案:

let sorted = array.sorted { t1, t2 in 
   if t1.isPriority == t2.isPriority {
      return t1.ordering < t2.ordering 
   }
   return t1.isPriority && !t2.isPriority 
}

这篇关于按两个属性对对象数组进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆