Ios 基于两个约束的排序词典
我试图根据两个约束对字典中的值(单词对象)进行排序。Word对象有两个相关字段:Ios 基于两个约束的排序词典,ios,swift,sorting,dictionary,anonymous-function,Ios,Swift,Sorting,Dictionary,Anonymous Function,我试图根据两个约束对字典中的值(单词对象)进行排序。Word对象有两个相关字段:Int:count和Bool:pinted。这些约束条件如下:首先,如果单词被固定(即value.pinted=true),我希望单词在排序数组中首先出现,而不管其计数字段如何。如果单词未固定,则我希望根据其count值和其他未固定单词之间的降序排列单词 我最终实现了如下排序功能: sortedWordsArr = wordsDict.sorted { if $0.value.pinned {
Int:count
和Bool:pinted
。这些约束条件如下:首先,如果单词被固定(即value.pinted=true
),我希望单词在排序数组中首先出现,而不管其计数
字段如何。如果单词未固定,则我希望根据其count
值和其他未固定单词之间的降序排列单词
我最终实现了如下排序功能:
sortedWordsArr = wordsDict.sorted {
if $0.value.pinned {
return $0.value.pinned && !$1.value.pinned
} else {
return $0.value.count > $1.value.count
}
}
然而,这似乎不起作用。当我锁定单词时,它们不会移动到数组的开头。他们似乎是随机游荡,有时甚至根本不是。我浏览过一些论坛,这些论坛似乎回答了如何使用多个约束进行排序的问题,但我仍然不太确定如何为我的约束设置sorted
闭包
在我看来,第一个条件:返回$0.value.pinted&&$1.value.pinted
将固定的单词$0
与不一定固定的对象$1
进行比较,因为$1
只是指定为另一个单词,在我的字典中不一定是固定的。这种想法是错误的吗?如果是这样,如何根据这些约束对词典进行正确排序
感谢您阅读本帖-感谢您的帮助 您可以扩展
Bool
以返回一个值
,该值类似于true
的1
和false
的0
,只需比较一个元组即可使用降序对它们进行排序。请注意,这将按降序对正确的固定元素进行排序,我不确定您是否要排序:
如果要保持固定值的原始计数顺序。请注意,字典是无序的集合:
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
})
谢谢你的回答!对于第一个排序函数,对元组排序的协议是什么?它是否首先基于第一个条目(
$0.value.pinted.value<$1.value.pinted.value
)进行排序,然后如果该条目相同,则基于第二个条目进行排序?@rjc810元组是可比的
,因为Swift 3 AFAIR的所有元素都符合可比的
。它最多有6个元素Bool
不符合compariable
这就是我向它们添加值Int
的原因。它将比较第一个元素,如果它们相等,它将比较下一个元素,依此类推
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
})