2017-05-26 26 views
3

我有一个对象,其列supervisor。在supervisor有以下值:最常出现的域Realm

  • 约翰
  • 玛丽
  • 菲尔
  • 约翰

我怎样才能回到约翰?

class Person: Object { 
    dynamic var name: String = String() 
+0

请在您的问题中包含您的领域模型定义。 –

+0

那里你去@DávidPásztor – Sam

+0

只有当你存储一个额外的表(我的意思是RealmObject)与这个特定的数据。 – EpicPandaForce

回答

4

Realm Results实施RealmCollectionType

RealmCollectionTypecount财产和max(_:) ag gregate操作。
你需要做的是一样的东西(以下是伪代码,将无法编译,只是提供给显示点):在element.count

results.filter {元素== results.max( byCount)}。第一

正在在Realm database执行上Result对象的任何操作,而不是在设备存储器中。

+0

是否有可能获得代码示例? – Sam

+0

也许,如果我得到了完整的赏金.. :-(.......我可以拿出代码,我现在有点忙了,如果你不想等待,检查类似的查询mongoDB,他们一直都这么做,或者在'Scala'或其他功能语言的某个地方。 – Mikasa

+0

对不起,我受到时间压力的赏金,仍然会感激一个完整的答案,我相信很多其他人也会。熟悉MongoDB – Sam

1

你可以取得与您的列supervisor相关联的所有Person对象(一List<T>?),并计算这些Person对象之间的name频率,从那里最大计数自然如下。

var frequencies = [String: Int]() 
for person in yourRealmObject.supervisor { 
    frequencies[person.name] = (frequencies[person.name] ?? 0) + 1 
} 

if let mostCommonName = frequencies.max(by: { $0.value < $1.value })?.key { 
    // ... mostCommonName holds string "John" (if that is most common) 
} 

当然不止一个名字可能是最常见的一种在您的专栏,在这种情况下,你可能想回到最常见的

if let mostCommonNames = frequencies.values.max() 
    .map({ maxCount in frequencies.filter { $0.value == maxCount }.map { $0.key } }) { 
    // ... mostCommonNames [String] 
} 

或者,如果你的数组实际上希望计算同一对象的出现次数(而不是查看name属性:可能有几个不同的Person:s和name"John"),您可以考虑使您的Person对象符合Hashable并计算实际唯一的频率对象(而不是对象的name属性的不同的频率)。

// Person is Hashable ... 
frequencies = [Person: Int]() 
for person in yourRealmObject.supervisor { 
    frequencies[person] = (frequencies[person] ?? 0) + 1 
} 

// ... 

由于Person是引用类型,对应于最常见的对象key将是对该对象的引用(例如,"John"Person)。


但是,可能我没有关注你的问题:如果这不是你所追求的,请展开它。

+0

我相信@Sam希望计算能够在'Realm数据库'中查找'john'作为最常见的出现值。某个'mongoDB'用户可以轻松完成。 – Mikasa

0

你有Person和你想获得匹配给定的名称及其Person监管对象之一:

class Person: Object { 
    dynamic var name: String = String() 
    let supervisors = List<Person>() 

    convenience init(name: String) { 
    self.init() 
    self.name = name 
    } 
} 

let realm = try! Realm() 

var me: Person! 

try! realm.write { 
    me = Person(name: "Me") 
    for supervisor in ["John", "Mary", "Phil"] { 
    me.supervisors.append(Person(name: supervisor)) 
    } 
    realm.add(me) 
} 

let john = me.supervisors.filter("name == 'John'")[0] 

print(john) 

此打印:

Person { 
    name = John; 
    supervisors = RLMArray <0x6080000f2280> (

); 
} 
相关问题