【问题标题】:Sort array based on the order of another array with repeating items根据具有重复项的另一个数组的顺序对数组进行排序
【发布时间】:2019-01-19 20:59:15
【问题描述】:

我有两个数组 - 一个包含有序 ID,另一个是包含具有 ID 属性的模型的数组。下面是一个 IDs 数组的例子:

ITCAw554sCHlN3A6q7Yl
n50cavoOJeRkjoRj11j3 
TE9ubEqV0tw0Hf4h8tk7 
TE9ubEqV0tw0Hf4h8tk7 
TE9ubEqV0tw0Hf4h8tk7 
ITCAw554sCHlN3A6q7Yl 
mkCs25zSf3J8QTvpS81b 
TE9ubEqV0tw0Hf4h8tk7 
Gc5lnHAKWm1OyeMkA9e7
n50cavoOJeRkjoRj11j3 
mkCs25zSf3J8QTvpS81b 
mkCs25zSf3J8QTvpS81b 
ITCAw554sCHlN3A6q7Yl 
X9WyrvEE253keNdlbVZc 
ITCAw554sCHlN3A6q7Yl

为了对第二个数组进行排序:

func sort(by ids: [String]) -> [Model] {
   return self.sorted{ ids.index(of: $0.id)! < ids.index(of: $1.id)! }
}

[Model].sort(by: idsArray)

这适用于具有唯一项的数组。但正如您在我的 IDs 数组中看到的那样,我有重复的。所以这个调用的结果会产生这个模型 ID 的顺序:

ITCAw554sCHlN3A6q7Yl
ITCAw554sCHlN3A6q7Yl
ITCAw554sCHlN3A6q7Yl
ITCAw554sCHlN3A6q7Yl
n50cavoOJeRkjoRj11j3
n50cavoOJeRkjoRj11j3
TE9ubEqV0tw0Hf4h8tk7
TE9ubEqV0tw0Hf4h8tk7
TE9ubEqV0tw0Hf4h8tk7
TE9ubEqV0tw0Hf4h8tk7
mkCs25zSf3J8QTvpS81b
mkCs25zSf3J8QTvpS81b
mkCs25zSf3J8QTvpS81b
Gc5lnHAKWm1OyeMkA9e7
X9WyrvEE253keNdlbVZc

如您所愿,我无法匹配 IDs 数组中的排序。那么有没有一种优雅的方式来实现我所需要的?谢谢

【问题讨论】:

  • 您只对“id”属性进行排序。应该区分它们的其他属性是什么?将它们与firstIndex(where:) 进行比较,而不是index(of:)
  • 还有一个 placeId 属性,因此两个 id 的组合使它们独一无二。
  • 那也用这个来比较。您需要比较“唯一性”,或者它是在多个属性之间计算的,(添加一个惰性 var 来构造它怎么样?返回一个元组 (id, placeId))。
  • 假设我将两者的组合 - (id, placeId) 元组放在第一个数组中。我将如何比较模型以便对它们进行排序?
  • 为什么不直接比较id呢? idsArray 不是按字母顺序排序的吗?

标签: arrays swift sorting


【解决方案1】:

我为“游乐场”创建了这个):

struct Model {
    let id: String
    let placeId: String

    init(id: String, placeId: String) {
        self.id = id
        self.placeId = placeId
    }
}

extension Model {
    static func all() -> [Model] {
        let ids = ["ITCAw554sCHlN3A6q7Yl",
                   "n50cavoOJeRkjoRj11j3",
                   "TE9ubEqV0tw0Hf4h8tk7",
                   "TE9ubEqV0tw0Hf4h8tk7",
                   "TE9ubEqV0tw0Hf4h8tk7",
                   "ITCAw554sCHlN3A6q7Yl",
                   "mkCs25zSf3J8QTvpS81b",
                   "TE9ubEqV0tw0Hf4h8tk7",
                   "Gc5lnHAKWm1OyeMkA9e7",
                   "n50cavoOJeRkjoRj11j3",
                   "mkCs25zSf3J8QTvpS81b",
                   "mkCs25zSf3J8QTvpS81b",
                   "ITCAw554sCHlN3A6q7Yl",
                   "X9WyrvEE253keNdlbVZc",
                   "ITCAw554sCHlN3A6q7Yl"]
        var models: [Model] = []
        for (index, anId) in ids.enumerated() {
            let aModel = Model(id: anId, placeId: String(index))
            models.append(aModel)
        }
        return models
    }
}

然后,我这样做了:

let initialModels = Model.all()
let shuffled = initialModels.shuffled()
print("shuffled:\n\(shuffled)")

所以,shuffled 的“顺序”错误。

您当前排序的问题是 id 不是唯一的。您需要对唯一的 id 进行排序,或者计算,使用比较多个属性等。否则,您无法分辨找到的多次出现之间是哪一个,根据您的说法,这是 id 和 @ 的组合987654326@属性。

let initialValues: [(String, String)] = initialModels.map({ ($0.id, $0.placeId) })

为了让你拥有:

func sort(by idsAndPlaceId: [(String, String)]) -> [Model]

然后,因为我不想使用self 等,但这可以适应:

let resorted = shuffled.sorted { (model1, model2) -> Bool in
    let model1Index = initialValues.firstIndex(where: { (id, placeId) -> Bool in
        return id == model1.id && placeId == model1.placeId
    })
    let model2Index = initialValues.firstIndex(where: { (id, placeId) -> Bool in
        return id == model2.id && placeId == model2.placeId
    })
    return model1Index ?? 0 < model2Index ?? 0
}
print("resorted:\n\(resorted)")

输出:

$>shuffled:
[Model(id: "ITCAw554sCHlN3A6q7Yl", placeId: "0"), 
Model(id: "n50cavoOJeRkjoRj11j3", placeId: "1"), 
Model(id: "mkCs25zSf3J8QTvpS81b", placeId: "10"), 
Model(id: "ITCAw554sCHlN3A6q7Yl", placeId: "5"),
Model(id: "X9WyrvEE253keNdlbVZc", placeId: "13"), 
Model(id: "n50cavoOJeRkjoRj11j3", placeId: "9"), 
Model(id: "ITCAw554sCHlN3A6q7Yl", placeId: "12"), 
Model(id: "TE9ubEqV0tw0Hf4h8tk7", placeId: "4"), 
Model(id: "mkCs25zSf3J8QTvpS81b", placeId: "11"), 
Model(id: "Gc5lnHAKWm1OyeMkA9e7", placeId: "8"), 
Model(id: "TE9ubEqV0tw0Hf4h8tk7", placeId: "3"), 
Model(id: "ITCAw554sCHlN3A6q7Yl", placeId: "14"), 
Model(id: "TE9ubEqV0tw0Hf4h8tk7", placeId: "2"), 
Model(id: "TE9ubEqV0tw0Hf4h8tk7", placeId: "7"), 
Model(id: "mkCs25zSf3J8QTvpS81b", placeId: "6")]
$>resorted:
[Model(id: "ITCAw554sCHlN3A6q7Yl", placeId: "0"), 
Model(id: "n50cavoOJeRkjoRj11j3", placeId: "1"), 
Model(id: "TE9ubEqV0tw0Hf4h8tk7", placeId: "2"), 
Model(id: "TE9ubEqV0tw0Hf4h8tk7", placeId: "3"), 
Model(id: "TE9ubEqV0tw0Hf4h8tk7", placeId: "4"), 
Model(id: "ITCAw554sCHlN3A6q7Yl", placeId: "5"), 
Model(id: "mkCs25zSf3J8QTvpS81b", placeId: "6"), 
Model(id: "TE9ubEqV0tw0Hf4h8tk7", placeId: "7"), 
Model(id: "Gc5lnHAKWm1OyeMkA9e7", placeId: "8"), 
Model(id: "n50cavoOJeRkjoRj11j3", placeId: "9"), 
Model(id: "mkCs25zSf3J8QTvpS81b", placeId: "10"), 
Model(id: "mkCs25zSf3J8QTvpS81b", placeId: "11"),
Model(id: "ITCAw554sCHlN3A6q7Yl", placeId: "12"), 
Model(id: "X9WyrvEE253keNdlbVZc", placeId: "13"), 
Model(id: "ITCAw554sCHlN3A6q7Yl", placeId: "14")]

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多