【问题标题】:sorting dictionary based on two constraints基于两个约束的排序字典
【发布时间】:2021-06-25 01:39:39
【问题描述】:

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

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

sortedWordsArr = wordsDict.sorted {
    if $0.value.pinned {
        return $0.value.pinned && !$1.value.pinned
    } else {
        return $0.value.count > $1.value.count
    }
}

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

在我看来,第一个条件:return $0.value.pinned && !$1.value.pinned 将固定词 $0 与不一定固定的对象 $1 进行比较,因为 $1 只是指定为另一个词,不一定是我的固定词字典。这种思路不正确吗?如果是这样,我怎样才能根据这些约束正确地对我的字典进行排序?

感谢您阅读这篇文章,感谢您的帮助!

【问题讨论】:

    标签: ios swift sorting dictionary anonymous-function


    【解决方案1】:

    您可以扩展Bool 以返回一个value,与true1false0 类似,并且只需比较一个元组以使用降序对它们进行排序。请注意,这也会按降序对正确的固定元素进行排序,我不确定您是否要排序:


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

    let sorted = wordsDict.sorted(by: {
        ($0.value.pinned.value, $0.value.count) > ($1.value.pinned.value, $1.value.count)
    })
    

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

    let sorted = wordsDict.sorted(by: {
        if $0.value.pinned { return true }
        if !$0.value.pinned && $1.value.pinned { return false }
        return $0.value.count > $1.value.count
    })
    

    使用三元运算符语法

    let sorted = wordsDict.sorted(by: {
        $0.value.pinned ? true :
        !$0.value.pinned && $1.value.pinned ? false :
        $0.value.count > $1.value.count
    })
    

    【讨论】:

    • 感谢您的回答!至于第一个 sorted 函数,对 tuple 进行排序的协议是什么?是否先根据第一个条目($0.value.pinned.value < $1.value.pinned.value)排序,然后如果该条目相同,则根据第二个条目排序?
    • @rjc810 元组自 Swift 3 AFAIR 起就是 Comparable,只要它的所有元素都符合 Comparable。它最多有 6 个元素。 Bool 不符合 Comparable 这就是为什么我要为它们添加值 Int。它将比较第一个元素,如果它们相等,它将比较下一个元素,依此类推
    猜你喜欢
    • 2016-12-05
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多