【问题标题】:Swift - Sorting array of objects by another array's propertySwift - 按另一个数组的属性对对象数组进行排序
【发布时间】:2019-03-15 23:20:38
【问题描述】:

我想按照与另一个对象数组共享的属性对对象数组进行排序

    struct GeneralComposition : Decodable {
        let id, formId, relationId, fixedContentTypeId, separatorId: Int
        let orderBy: Int

    }
    struct FixedContentType: Decodable {
        let name, htmlType: String
        let isEditable: Int
        let typeId : String


    }



   var fixedContentType = [FixedContentType]()
   var generalComposition = [GeneralComposition]()

GeneralComposition我得到了项目必须有的顺序,用orderBy,然后取每个项目的fixedContentTypeID,与FixedContentType中的typeId比较,得到这个内容必须的顺序显示在屏幕上。

你知道怎么做吗?

谢谢!

【问题讨论】:

  • 抱歉,您能告诉我们您希望如何获得输出吗?
  • @matt - 这看起来像是重复的,但并不完全相同。 indexOf 模式在这里不适用。
  • Cosorting 在我看来是 cosorting。这不是以前从未讨论过的。
  • 也许,我们可以找到一个组合示例,它不依赖于第二个数组中的标识符index(of:),而是第二个数组中对象的属性,例如这个。我看了看,一个没有跳出来看我,但我敢打赌那里有一个......

标签: arrays swift sorting object


【解决方案1】:

您可以为fixedContentTypeIDgeneralComposition 建立一个字典:

let order = generalComposition.reduce(into: [Int: Int]()) { result, value in
    result[value.fixedContentTypeId] = value.orderBy
}

您现在有一种有效的方法可以在FixedContentType 对象数组中查找给定typeIdorderBy 值。您可以使用它进行排序:

fixedContentType.sort {
    (order[$0.typeId] ?? 0) < (order[$1.typeId] ?? 0)
}

顺便说一句,您的typeIdStringfixedContentTypeIdInt。我假设这是在准备问题时引入的一个错字,并且它们实际上都是Int。如果它们真的是不同的类型(这会很奇怪),那么解决方案将是相似的,尽管您必须进行一些转换。但我不想去那里,除非你确认这确实是你的模型。

但是,鉴于您的 typeId 确实是 String,您可以将您的字典设为 [String: Int]

let order = generalComposition.reduce(into: [String: Int]()) { result, value in
     result[String(value.fixedContentTypeId)] = value.orderBy
}

【讨论】:

  • 协议怎么样?
  • 制作具有共享属性的协议和该协议的数组并对其进行排序?
  • 我建议您发布自己的答案,展示您建议如何使用协议。我个人认为这不会有什么帮助。我的回答的主要目的是使用字典来实现 O(1) 性能以检索 orderBy 值。
  • 如果我想回答我会想知道区别并从高层获得经验 ^_^ 无论如何谢谢
  • 有一天我会像你一样关心 O(1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多