筛选结果中的最高数值

目标是从Realm获取对象,该对象在其属性之一中包含最高的数字值。该对象具有人员名称(字符串)和person_id(也是字符串)。

PersonClass: Object {
   @objc dynamic var name = ""
   @objc dynamic var person_id = ""
}

person_id可以是数字,字符串或组合。对于此过滤器,所有不只包含数字的字符串都应被忽略。桌子可能看起来像这样

name     person_id
Henry    0000
Leroy    test
Frank    3333
Steve    a123

结果应该是

Henry 0000
Frank 3333 <- .last or the highest

举个简单的例子,让我们看一下这个数组

let arrayOfWords = ["thing","1","stuff","2"]

和一些代码来获取字符串“ 1”和“ 2”。

let swiftResults = arrayOfWords.compactMap { Int($0) } //knowing that Int has limitations
swiftResults.forEach { print($0) } //note we can use .last to get the last one

虽然可以通过获取所有Realm对象然后应用Swift过滤器来解决,但问题是可能有成千上万的人,并且一旦将结果对象作为Swift枚举对象(如数组)进行操作,就不会只是断开了与Realm的连接(失去了对象的实时更新功能),但它们不再被延迟加载,占用了内存并可能使设备不堪重负。

wpz731 回答:筛选结果中的最高数值

由于领域查询不支持正则表达式,因此您必须检查person_id中是否包含字母,并使用@max获取最大值。

let regexAnythingButDigits = "[^0-9]"
let maxNumericID = realm.objects(PersonClass.self).filter("person_id NOT CONTAINS[c] 'a' person_id NOT CONTAINS[c] 'b' AND ..[all letters in between]... AND person_id NOT CONTAINS[c] 'z' AND person_id.@max",regexAnythingButDigits)
,

根据rs7答案中提供的见解,这是一个符合问题标准的编码解决方案。

TLDR:我们构建了一个复合AND谓词,该谓词可为所有不含字母字符的字符串过滤Realm。即获取所有不包含“ a”,“ b”和“ c”等的字符串。

这很重要,因为可能有成千上万个对象,而使用纯Swift进行过滤是非常简单的代码方式,这样做会绕过Realm的延迟加载特性,并且需要将整个数据集加载到数组中以用于过滤,可能会淹没设备。

此解决方案使Realm对象保持懒惰,从而避免了该问题。

let charStringToOmit = "abcdefghijklmnopqrstuvwxyz" //the invalid chars
let charsOmitArray = Array(charStringToOmit) //make an array of Char objects
var predicateArray = [NSPredicate]() //the array of predicates

//iterate over the array of char objects
for char in charsOmitArray {
    let c = String(char) //make each char a string
    let pred = NSPredicate(format: "!(person_id CONTAINS[cd] %@)",c) //craft a predicate
    predicateArray.append(pred) //append the predicate to the array
}

//craft compound AND predicate
let compound = NSCompoundPredicate(andPredicateWithSubpredicates: predicateArray) 

let realm = try! Realm()
let results = realm.objects(PersonClass.self).filter(compound).sorted(byKeyPath: "person_id")

if let lastPerson = results.last {
    print(lastPerson.person_id)
}

我简化了为该示例提供的初始数据集,并将其限制为仅包含a-z和0-9个字符,但可以对其进行扩展。

本文链接:https://www.f2er.com/3077321.html

大家都在问