如何解决基于两个约束的排序字典
我正在尝试根据两个约束对字典(Word 对象)中的值进行排序。 Word 对象有两个相关字段:Int: count
和 Bool: 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
只是被指定为另一个词,不一定是我字典中的固定词。这个思路不正确吗?如果是这样,我如何根据这些限制对我的字典进行正确排序?
感谢您阅读这篇文章 - 感谢您的帮助!
解决方法
您可以扩展 Bool
以返回一个 value
,它类似于 1
的 true
和 0
的 false
并且只需比较一个元组使用降序对它们进行排序。请注意,这也会按降序对真实的固定元素进行排序,我不确定您是否要排序:
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
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。