我在swift中有一个realm数据库,它有时间序列数据
所以我有两个对象
Object1: LastLogin(Epoch), name(String)
Object2: Logintime(Epoch), points(Int)
我想要做的是取LastLoginTime
并使用它来搜索Object2s LoginTime
,如果不匹配,则找到最接近的。
我的目标是让object1
获得积分值。
谢谢
编辑:
我在想,如果没有其他方法,那么我可以将时期转换为swift中的日期,然而我会处于相同的情况,我需要在领域数据库中搜索最近的日期,那里这似乎不是一个明确的方法。
答案 0 :(得分:1)
这是我刚才想到的解决方案。如果你有更快的方式或更好的方式,那么请说。
我要做的第一件事是获取Object2的列表,然后通过时间戳对它们进行排序。
let realm = try! Realm()
let object2List = realm.objects(Object2.self).sorted(byKeyPath: Logintime)
我们现在有一个object2列表,不在内存中,按loginTime排序。
之后,我搜索了一个最接近的整数算法,并在SO上找到了一个。这是转换:
func search(_ value: Int, _ a: [Int]) -> Int {
if(value < a[0]) {
return a[0];
}
if(value > a[a.count-1]) {
return a[a.count-1];
}
var lo = 0;
var hi = a.count - 1;
while (lo <= hi) {
var mid = (hi + lo) / 2;
if (value < a[mid]) {
hi = mid - 1;
} else if (value > a[mid]) {
lo = mid + 1;
} else {
return a[mid];
}
}
// lo == hi + 1
return (a[lo] - value) < (value - a[hi]) ? a[lo] : a[hi];
}
var testInt = 200;
var list = [150,190, 350, 908]
search(testInt,list) //=> 190
我从https://stackoverflow.com/a/30245398/9201306
获得了此代码如果链接由于某种原因不再起作用,他只是说“如果数组已经排序,你可以在log n操作中进行修改的二进制搜索:”
希望有所帮助