【问题标题】:How do I search a Realm database to get the closest date, if no match was found?如果未找到匹配项,如何搜索 Realm 数据库以获取最接近的日期?
【发布时间】:2018-01-11 09:11:05
【问题描述】:

我有一个 swift 领域数据库,其中包含时间序列数据

所以我有两个对象

Object1: LastLogin(Epoch), name(String)
Object2: Logintime(Epoch), points(Int)

我想做的是获取LastLoginTime 并使用它来搜索Object2s LoginTime,如果没有匹配,则找到最接近的。

我的目标是让object1拥有积分值。

谢谢

编辑:

我在想,如果没有其他方法,那么我可以快速将时代转换为日期,但是我会遇到同样的情况,我需要在领域数据库中搜索最接近的日期,那里这似乎不是一个明确的方法。

【问题讨论】:

  • Realm 没有内置的方法可以为您执行此操作,因此您需要实现自己的搜索算法。
  • @DávidPásztor 我猜到了,但不确定。我发布了一个答案,以防其他人遇到这个问题。谢谢大卫

标签: swift realm


【解决方案1】:

这是我刚刚想到的解决方案。如果您有更快或更好的方法,请说。

我要做的第一件事是获取 Object2 的列表,然后通过时间戳对它们进行排序。

let realm = try! Realm()

let object2List = realm.objects(Object2.self).sorted(byKeyPath: Logintime)

我们现在有一个 object2 列表,不在内存中,按 loginTime 排序。

之后,我搜索了一个最接近的整数算法,并在 SO 上的 java 中找到了一个。这是转换:

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 操作中进行修改的二进制搜索:”

希望有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 2021-07-27
    • 2011-04-24
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2010-10-19
    • 2014-03-24
    相关资源
    最近更新 更多