我有一个具有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
。我一直在绞尽脑汁,并希望有人可以看到这个算法?
答案 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;