基于两个约束的排序字典
sorting dictionary based on two constraints
我正在尝试根据两个约束对字典(Word 对象)中的值进行排序。 Word 对象有两个相关字段:Int: count
和 Bool: 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
用于 true
和 0
用于 [=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
})
我正在尝试根据两个约束对字典(Word 对象)中的值进行排序。 Word 对象有两个相关字段:Int: count
和 Bool: 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
用于 true
和 0
用于 [=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
})