如何根据字符串的出现次数对数组进行排序?

时间:2017-02-16 07:35:28

标签: swift

如何根据字符串

的出现次数对数组进行排序

示例:  var array = [“Hello”,“Me”,“That”,“Me”,“Hello”,“Me”,“as”,“the”]

和排序数组应该是这样的

[ “我”, “您好”, “这”, “如”, “该”]

7 个答案:

答案 0 :(得分:3)

已更新为Swift 3

var array = ["Hello","Me","That","Me","Hello","Me","as","the"]

            var counts:[String:Int] = [:]

            for item in array {
                counts[item] = (counts[item] ?? 0) + 1
            }
            print(counts)

            let result = counts.sorted { $0.value > $1.value }.map { $0.key }
            print(result)

            array.removeAll()
            for string in result {
                array.append(string)
            }
            print(array)

答案 1 :(得分:2)

这是我能够提出的:

var array = ["Hello","Me","That","Me","Hello","Me","as","the"]

// record the occurences of each item
var dict = [String: Int]()
for item in array {
    if dict[item] == nil {
        dict[item] = 1
    } else {
        dict[item]! += 1
    }
}
// here I sort the dictionary by comparing the occurrences and map it so that the result contains only the key (the string)
let result = dict.sorted { $0.value > $1.value }.map { $0.key }

答案 2 :(得分:2)

试试这个 -

经过测试并按预期工作 -

 let arrayName = ["Hello","Me","That","Me","Hello","Me","as","the"]
    var counts:[String:Int] = [:]
    for item in arrayName {
        counts[item] = (counts[item] ?? 0) + 1
    }

   let array = counts.keysSortedByValue(isOrderedBefore: >)
   print(array) // Output - ["Me", "Hello", "the", "That", "as"]

创建字典扩展 -

extension Dictionary {
func sortedKeys(isOrderedBefore:(Key,Key) -> Bool) -> [Key] {
    return Array(self.keys).sorted(by: isOrderedBefore)
}

// Faster because of no lookups, may take more memory because of duplicating contents
func keysSortedByValue(isOrderedBefore:(Value, Value) -> Bool) -> [Key] {
    return Array(self)
        .sorted() {
            let (_, lv) = $0
            let (_, rv) = $1
            return isOrderedBefore(lv, rv)
        }
        .map {
            let (k, _) = $0
            return k
     }
   }
 }

答案 3 :(得分:1)

看起来很简单。 1.与你的阵列区别开来。 2.根据不同的清单计数。 3.将结果保存在集合中 - 即字典。 4.对新集合进行排序。

答案 4 :(得分:1)

循环遍历数组并维护字数字典。确保可以根据值对字典进行排序,最后获取密钥集并将其转换回数组。

答案 5 :(得分:1)

这应该有用。

var array = ["Hello","Me","That","Me","Hello","Me","as","the"]
var tR : [String : Int] = [:]
let finalResult = array.reduce(tR) { result, item in
    var tArr : [String: Int] = result
    if let count = tArr[item] {
        tArr[item] = count+1
    } else {
        tArr[item] = 1
    }
    return tArr
    }
    .sorted(by: { item1, item2 in
        return item1.value > item2.value

    }).map() { $0.key }

答案 6 :(得分:0)

请试试这个,希望有所帮助

var terms =  ["Hello","Me","That","Me","Hello","Me","as","the"]
var termFrequencies = [String: Int]()
for t in terms {
    if termFrequencies[t] == nil {
        termFrequencies[t] = 1
    } else {
        termFrequencies[t] = termFrequencies[t]! + 1
    }
}

for value in terms {
    let index = termFrequencies[value] ?? 0
    termFrequencies[value] = index + 1
}

let result = termFrequencies.sorted{$0.1 > $1.1}.map{$0.0}