如何在Swift中按照未来的时间对对象进行排序?

时间:2015-05-04 18:12:39

标签: swift sorting datetime

我有一个具有time属性的对象数组,我希望以特殊方式对其进行排序。我想对它们进行排序,使得对象具有未来的时间优先,然后时间在它后面排序,然后循环回到过去的项目。这是我到目前为止所做的:

struct MyStruct {
    var name: String = ""
    var time: Double = Double(0)
}

var currentTime = NSDate().timeIntervalSince1970
var myArr: [MyStruct] = []
myArr.append(MyStruct(name: "Abc", time: currentTime - 3)) // Past
myArr.append(MyStruct(name: "Def", time: currentTime - 5)) // Past
myArr.append(MyStruct(name: "Ghi", time: currentTime - 1)) // Past
myArr.append(MyStruct(name: "Jkl", time: currentTime + 3)) // Future
myArr.append(MyStruct(name: "Mno", time: currentTime + 2)) // Future

var mySorted = myArr.sorted { $0.time < $1.time }

mySorted // Outputs structs in this order: Def, Abc, Ghi, Mno, Jkl

我无法弄清楚在排序谓词中要做什么,以便按照最接近的未来时间进行排序。换句话说,我想根据当前时间显示出现的下一个对象。所以上面应该排序为:Mno, Jkl, Ghi, Abc, Def。我一直在绞尽脑汁,并希望有人可以看到这个算法?

2 个答案:

答案 0 :(得分:1)

如果您想使用功能更强大的款式,可以使用

let mySorted2 = 
    myArr.filter{ $0.time > currentTime }.sorted{ $0.time < $1.time } +
    myArr.filter{ $0.time <= currentTime }.sorted{ $0.time > $1.time }

我认为此代码更具可读性,因为代码更符合您的要求。获取所有未来日期并按升序对其进行排序,然后附加按降序排序的所有过去日期。

答案 1 :(得分:0)

它不应该那么难......如果它们既是过去的,也是将来的,或者每一方都是一个,那么比较是不同的。

此代码应该有效:

   public static Card[] getAll(){
    Card[] brb = new Card[cards.size()];
    int tempCount = 0;
    for(Card c : cards){
        brb[tempCount] = c;
        tempCount++;
    }
    return brb;