Swift按照数组元素出现的次数及大小排序

要求如下:

1、已知一个数组,按照单个元素在数组中出现的次数作为重新排序的依据,个数多的排在前面
2、相同个数时候,元素值大的排前面

例子:

[1, 2, 2, 3, 5, 5]
经过计算得到的结果是:
[5, 5, 2, 2, 3, 1]

一种解决方法是:

import UIKit

extension 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,1,3,3,4,5,4,6,6,6]
print(ary.sortByRepeatCount())
//输出 "[6, 6, 6, 1, 1, 1, 4, 4, 3, 3, 5, 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,2,6,1,8,2,6,6]
let beta = [6,6,6,2,2,2,8,8,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的扩展

时间: 2024-10-10 16:48:21

Swift按照数组元素出现的次数及大小排序的相关文章

SWIFT——枚举数组元素的方法

1 let array = ["沈阳", "北京", “上海", "广州”] 2 3 var i = 0 4 for i in 0..array.count 5 { 6 print("\(i):{" + array[i] + "}") //容易输出数组索引 7 } 8 9 println() 10 for value in array 11 { 12 print("<" + val

求数组元素出现的次数

源码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <script> var ary =["丁少","王新","丁少"]; ary.sort(); //给数组按字母排序 var res = [];

数组元素的填充与替换、排序和复制

import java.util.Arrays; public class Copy2 { public static void main(String [] args){ //数组填充 fill(要元素替换的数组int[]a,填充的值int value) int []a = new int [6]; Arrays.fill(a,8); //将a数组中所有元素填为8 for(int n:a){ //foreach遍历数组 System.out.print(n+" "); } Syste

统计数组[1-n]中各个元素出现的次数,时间复杂度O(n),空间复杂度O(1),可改变数组结构

* 统计数组中每个元素出现的次数 * 数组长度为N,每个元素范围为[1,N]. * 统计各个元素出现的次数,要求时间复杂度为O(N),空间复杂度为O(1).可以修改数组中元素的值. * * 思路:遍历到每一个元素,将该(元素值 - 1)作为下标值,将该下标的元素赋值(若为正,赋值-1:若为负值,-1) * 最后,每个下标中存储的元素即为统计次数,而下标+1即为元素值. 代码: public static void main(String[] args) { // TODO Auto-genera

在一维数组中查找某个元素出现的次数

题目: 编写一个函数,实现在一个一维整型数组中查找某个元素出现的次数. 函数原型:int Search( int a[ ], int n, int x ) 参数说明: a是一维整型数组 n是数组中元素的个数 x是要查找的元素 返回值:如果找到,返回x的出现次数:否则,返回零. 1 int Search( int a[ ], int n, int x ) 2 { int i, count; 3 count=0; 4 for( i=0; i<n; i++ ) 5 if( a[i]==x ) coun

统计数组中每个元素出现的次数

Dictionary<string, int> counter = new Dictionary<string, int>(); foreach (string c in 数组) { if (counter.ContainsKey(c)) { counter[c]++; } else { counter.Add(c, 1); } if (counter[max] < counter[c]) max = c; } max为元素 counter[max]出现次数最多的元素出现的次

JS实现数组中每一个元素出现的次数

一.var arrayObj = [1, 1, 2, 3, 3, 3, 4, 5, 5]; 找出数组中每一个元素出现的次数,我这里简单一下就用for循环来实现.首先先声明几个变量, var temp = "";//中间变量,临时存储循环时用来存储数组中的某个元素 var count = 0;//循环时用来存储数组中的某个元素出现的次数 var arrNew = new Array(); //新建一个数据用来存放循环后的数据 下面开始循环 for(var i=0;i<arrayOb

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

MongoDB统计文档(Document)的数组(Array)中的各个元素出现的次数

一,问题描述 [使用 unwind unpack Document 里面的Array中的每个元素,然后使用 group 分组统计,最后使用 sort 对分组结果排序] 从 images.json 文件中导入数据到MongoDB服务器 mongoimport --drop -d test -c images images.json 其中Document的示例如下: > db.images.find() { "_id" : 3, "height" : 480, &