Aquí tengo la matriz de los elementos. Me gustaría obtener la matriz de elementos de eso, en orden descendente según la ocurrencia de los elementos.
Ej: Tengo una matriz de elementos ["a","b","a","g","a","c","g","g","b","a","b","c","b","c","f","a"]
La salida esperada es ["a", "b", "c", "g", "f"] - Porque tengo a's-5, b's-4, c's-3, g's-3, f's-1 . (Mostrando en orden descendente, basado en el conteo de elementos repetidos)
let x = ["1","2","3","1","1","2","3","3","3","3"] let cnts = x.reduce(into: [:]) { counts, word in counts[word, default: 0] += 1 } print(cnts) //["a": 5, "c": 3, "f": 1, "g": 3, "b": 4]Estoy atascado después de esto, ¿alguien puede ayudarme?
Ya casi has llegado. Ahora puede ordenar el diccionario según el número decreciente de ocurrencias y luego extraer las claves:
let result = cnts.sorted(by: { $0.value > $1.value }).map { $0.key }El ejemplo completo:
let x = ["a","b","a","g","a","c","g","g","b","a","b","c","b","c","f","a"] // 5 x "a", 4 x "b", 3 x "c", 1 x "f", 3 x "g" let cnts = x.reduce(into: [:]) { counts, word in counts[word, default: 0] += 1 } print(cnts) // ["g": 3, "c": 3, "b": 4, "f": 1, "a": 5] let result = cnts.sorted(by: { $0.value > $1.value }).map { $0.key } print(result) // ["a", "b", "g", "c", "f"]Puede ordenar la matriz por:
let arr = ["a","b","a","g","a","c","g","g","b","a","b","c","b","c","f","a"] var counts: [String: Int] = [:] arr.forEach { counts[$0, default: 0] += 1 } print(counts) //["a": 5, "c": 3, "g": 3, "f": 1, "b": 4] let sortedByValueDictionary = counts.sorted(by :{ $0.1 < $1.1 }).map { $0.key } print(sortedByValueDictionary) //["a", "b", "g", "c", "f"]Si está buscando un algoritmo de complejidad de tiempo O(n) , puede usar la ordenación de conteo (al precio de la complejidad del espacio):
let arr = ["a","b","a","g","a","c","g","g","b","a","b","c","b","c","f","a"]Construyamos el histograma de esta matriz:
let histogram = arr.reduce(into: [:]) { $0[$1, default: 0] += 1 }Luego construya una matriz de matrices donde los elementos se colocan en el índice que corresponde al conteo de su frecuencia:
var acc = Array(repeating: [String](), count: arr.count) //Array indexes are 0-based let lastIndex = arr.count - 2 let arrayOfArrays: [[String]] = histogram .reduce(into: acc) { accumulator, entry in accumulator[lastIndex - entry.value] += [entry.key] }Y luego aplanarlo:
let result = arrayOfArrays.flatMap { $0 }Y comprueba el resultado:
print(result)cuyos rendimientos :
["a", "b", "c", "g", "f"]
Tenga en cuenta que los elementos con la misma frecuencia pueden aparecer en diferentes órdenes entre ejecuciones, ya que un Dictionary no es una colección ordenada.