首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据匹配对领域中的过滤结果进行排序

根据匹配对领域中的过滤结果进行排序
EN

Stack Overflow用户
提问于 2021-01-11 22:18:37
回答 1查看 39关注 0票数 1

我有一个有大约100k个条目的字典,并提供了一个搜索功能,用户可以在其中搜索英文/中文字符串,所有包含此字符串的条目都将显示出来。条目的结构如下:

代码语言:javascript
复制
class DictionaryEntry: Object, Identifiable {
    @objc dynamic var id: String = NSUUID().uuidString
    @objc dynamic var character: String = ""
    @objc dynamic var pinyin: String = ""
    @objc dynamic var definition: String = ""
}

假设我们有以下两个条目:

代码语言:javascript
复制
entry1 = "宝山 / Bǎoshān / Bǎoshān district of Shanghai" 
entry2 = "上海 / Shànghǎi / Shanghai" 

搜索字符串是“上海”。我通过这种方式过滤条目:

代码语言:javascript
复制
let realm = try! Realm()
realm.objects(DictionaryEntry.self)
     .filter("pinyin CONTAINS[cd] %@ OR definition CONTAINS[cd] %@ OR character CONTAINS[cd] %@", searchString, searchString, searchString)
   //.sorted(by: ???)

因为两个条目都包含搜索字符串,所以两个条目都会出现,但它们还没有按任何逻辑排序。我想根据最高的“覆盖率/匹配度”对结果进行排序。因此,首先应该出现“上海”,然后是“上海大学”,……,最后是“苏州和上海之间的古运河”。有没有内置的领域解决方案?

EN

回答 1

Stack Overflow用户

发布于 2021-01-11 22:28:15

Realm的Results有内置的排序方法,请参阅文档中的Sorting

如果要根据特定属性进行排序,可以使用sorted(byKeyPath:),它采用单个String来表示要排序的属性名称:

代码语言:javascript
复制
let realm = try! Realm()
realm.objects(DictionaryEntry.self)
   .filter("pinyin CONTAINS[cd] %@ OR definition CONTAINS[cd] %@ OR character CONTAINS[cd] %@", searchString, searchString, searchString)
   .sorted(byKeyPath: "pinyin")

或者,如果您想要根据所有3个属性进行排序,您可以使用sorted(by:),它接受SortDescriptor对象的Sequence,也可以基于键路径创建:

代码语言:javascript
复制
let realm = try! Realm()
realm.objects(DictionaryEntry.self)
   .filter("pinyin CONTAINS[cd] %@ OR definition CONTAINS[cd] %@ OR character CONTAINS[cd] %@", searchString, searchString, searchString)
   .sorted(by: [SortDescriptor(keyPath: "pinyin"), SortDescriptor(keyPath: "definition"), SortDescriptor(keyPath: "character")])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65668538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档