2017-06-12 41 views
2

一個String數組我有一個大陣列那樣:排序斯威夫特

var tableau = ["Salut", "Hey", "Salut", "Hey", "Hey", "Mom", "Hey", "Dad", "Mom", "Hey", "Plop"]

,現在我想每個單詞的數組排序由重複這樣的數組像數:

var tableauTrier = ["Hey", "Salut", "Mom", "Dad", "Plop"] 

如何使用最少的內存對它們進行排序? 請幫助我!

回答

6
var tableau = ["Salut", "Hey", "Salut", "Hey", "Hey", "Mom", "Hey", "Dad", "Mom", "Hey", "Plop"] 

var counts = [String: Int]() 

// generate dictionary of counts for each word 
for word in tableau { 
    counts[word] = (counts[word] ?? 0) + 1 
} 

// Sort the tuples based on the count and use map to extract the word 
let result = counts.sorted { $0.value > $1.value }.map { $0.key } 
print(result) 

// ["Hey", "Mom", "Salut", "Plop", "Dad"] 
+1

對於bett因爲Swift 3的可讀性(我認爲)它也可以寫成'counts.sorted {$ 0.value> $ 1.value} .map {$ 0.key}' –

+1

我喜歡那個@LeoDabus。它使解決方案更加明顯地正確。使用IBM Swift Sandbox進行快速檢查可以驗證此功能是否確實隨Swift 3.0一起提供。 – vacawama

0

一個小幫手陣列,就可以得到它像這樣:

var tableau = ["Salut", "Hey", "Salut", "Hey", "Hey", "Mom", "Hey", "Dad", "Mom", "Hey", "Plop"] 
var unique = Array(Set(tableau)) 
unique.sort { (str1, str2) -> Bool in 
    let str1Count = tableau.reduce(0, { (result, str) -> Int in 
     return str == str1 ? result+1 : result 
    }) 
    let str2Count = tableau.reduce(0, { (result, str) -> Int in 
     return str == str2 ? result+1 : result 
    }) 
    return str1Count > str2Count 
} 
1

或者 - 只是爲了好玩 - 有NSCountedSet

let tableau = ["Salut", "Hey", "Salut", "Hey", "Hey", "Mom", "Hey", "Dad", "Mom", "Hey", "Plop"] 
let set = NSCountedSet(array: tableau) 
let array = (set.allObjects as! [String]).sorted(by: {set.count(for: $0) > set.count(for: $1)}) 
print(array) 
// [Hey, Mom, Salut, Dad, Plop] 
+0

多麼有趣的解決方案 – Yapoto

+0

您需要確保'Foundation'已導入。 – vacawama

+0

@vacawama是的,但在iOS中,您將導入包含'基礎'的'UIKit'' – vadian

0

這裏的解決方案是一個解決方案:

var result = tableau.sorted(by: { current, next in 
    tableau.filter { $0 == current }.count > tableau.filter { $0 == next }.count 
}).reduce([String](), { 
    if $0.contains($1) { 
     return $0 
    } else { 
     var newPartial = $0 
     newPartial.append($1) 
     return newPartial 
    } 
}) 

print(result) // ["Hey", "Salut", "Mom", "Dad", "Plop"] 
+0

Ops誤讀了這個問題。將修改答案.. – paulvs