基于两个约束的排序字典

sorting dictionary based on two constraints

我正在尝试根据两个约束对字典(Word 对象)中的值进行排序。 Word 对象有两个相关字段:Int: countBool: pinned。这些约束如下:首先,如果单词被固定(即 value.pinned = true),我希望单词首先出现在排序数组中,而不管它的 count 字段。如果该词未固定,那么我希望该词根据其 count 值与其他未固定词的降序排列。

我最终实现了这样的排序功能:

sortedWordsArr = wordsDict.sorted {
    if [=10=].value.pinned {
        return [=10=].value.pinned && !.value.pinned
    } else {
        return [=10=].value.count > .value.count
    }
}

但是,这似乎不起作用。当我固定单词时,它们不会移动到数组的开头。他们似乎随机地洗牌,有时根本不洗牌。我浏览过的论坛似乎回答了如何使用多个约束进行排序的问题,但我仍然不太确定如何为我的约束设置 sorted 闭包。

在我看来,第一个条件:return [=17=].value.pinned && !.value.pinned 将固定词 [=18=] 与不一定固定的对象 </code> 进行比较,因为 <code> 只是指定为另一个词,不一定是我字典里固定的词。这种思路不正确吗?如果是这样,我怎样才能根据这些限制对我的字典进行正确排序?

感谢您阅读本文post- 感谢您的帮助!

您可以将 Bool 扩展到 return 一个 value 相当于 1 用于 true0 用于 [=19] =] 并比较一个元组以使用降序对它们进行排序。请注意,这将按降序对为真的固定元素进行排序,我不确定您是否愿意排序:


extension Bool {
    var value: Int { self ? 1 : 0 }
}

let sorted = wordsDict.sorted(by: {
    ([=11=].value.pinned.value, [=11=].value.count) > (.value.pinned.value, .value.count)
})

如果您想保留固定值的原始计数顺序。请注意,字典是一个无序集合:

let sorted = wordsDict.sorted(by: {
    if [=12=].value.pinned { return true }
    if ![=12=].value.pinned && .value.pinned { return false }
    return [=12=].value.count > .value.count
})

使用三元运算符语法

let sorted = wordsDict.sorted(by: {
    [=13=].value.pinned ? true :
    ![=13=].value.pinned && .value.pinned ? false :
    [=13=].value.count > .value.count
})