要求如下:
1、已知一个数组,按照单个元素在数组中出现的次数作为重新排序的依据,个数多的排在前面2、相同个数时候,元素值大的排前面
例子:
[1,2,3,5,5]经过计算得到的结果是:[5,1]
一种解决方法是:
import UIKitextension Sequence where Iterator.Element == Int{ private func removeRepeats()->[Int]{ let set = Set(self) return Array(set).sorted {$0>$1} } private func countFor(value:Int)->Int{ return filter {$0 == value}.count } func sortByRepeatCount()->[Iterator.Element]{ var wets = [[Int]]() let clearedAry = removeRepeats() for i in clearedAry{ wets.append([i,countFor(value: i)]) } wets = wets.sorted { $0[1] > $1[1] } var result = [Int]() for x in wets{ let i = x[0] let count = x[1] for _ in 0..<count{ result.append(i) } } return result }}var ary = [1,1,2,3,4,5,6,6]print(ary.sortByRepeatCount())//输出 "[6,6,1,4,2]\n"
别的网友提供了更直观更简单的方法:
extension SequenceType where Generator.Element : Hashable { func frequencIEs() -> [Generator.Element:Int] { var results : [Generator.Element:Int] = [:] for element in self { results[element] = (results[element] ?? 0) + 1 } return results }}let Alpha = [2,8,6]let beta = [6,1]let sorted = Alpha.frequencIEs().sort { if $0.1 > $1.1 { // if the frequency is higher,return true return true } else if $0.1 == $1.1 { // if the frequency is equal return $0.0 > $1.0 // return value is higher } else { return false // else return false }}
注意后一种解决办法只能在Swift2.x中运行,如果要在Swift3中运行需要略做修改,请参考我写的另一篇博文:
Swift3中如何为Array写一个限定Type的扩展
总结以上是内存溢出为你收集整理的Swift按照数组元素出现的次数及大小排序全部内容,希望文章能够帮你解决Swift按照数组元素出现的次数及大小排序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)