Realm最常出现

时间:2017-05-26 03:02:39

标签: swift realm

我有一个列supervisor的对象。在supervisor中,有以下值:

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

我怎样才能归还约翰?

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

3 个答案:

答案 0 :(得分:4)

Realm Results实施RealmCollectionType

RealmCollectionType具有count属性和max(_:)聚合操作。
你需要做的是(以下是伪代码,不会编译,只是为了说明这一点):

  

results.filter {element.count中的元素== results.max(byCount)}。第一​​次

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

答案 1 :(得分:1)

您可以获取与您的列Person相关联的所有supervisor个对象(List<T>?),并计算这些name个对象中的Person个频率,从最大数量自然遵循的地方。

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与{{1} } 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")。

但是,我可能不会回答你的问题:如果不是你想要的话,请扩展它。

答案 2 :(得分: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> (

  );
}