【问题标题】:sort a String array in Swift在 Swift 中对字符串数组进行排序
【发布时间】:2017-11-14 01:51:47
【问题描述】:

我有一个这样的大数组:

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

现在我想要一个数组,每个单词按重复次数排序,所以这样的数组:

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

如何使用最少的内存对它们进行排序? 请帮帮我!

【问题讨论】:

    标签: ios arrays swift string sorting


    【解决方案1】:
    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"]
    

    【讨论】:

    • 为了更好的可读性,因为 Swift 3(我认为)它也可以写成 counts.sorted { $0.value > $1.value }.map { $0.key }
    • 我喜欢@LeoDabus。它使解决方案更明显正确。对 IBM Swift Sandbox 的快速检查证实了 Swift 3.0 确实提供了此功能。
    【解决方案2】:

    或者——只是为了好玩——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]
    

    【讨论】:

    • 多么有趣的解决方案
    • 您需要确保 Foundation 已导入。
    • @vacawama 是的,但在 iOS 中,您无论如何都会导入 UIKit,其中包括 Foundation
    • 你得到的数组是[Any]。如果你需要[String],你会想要转换结果。
    • 没错,UIKit 包括 Foundation,但对于模型类,人们可能不知道 import UIKit
    【解决方案3】:

    使用一个小辅助数组,您可以像这样处理它:

    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
    }
    

    【讨论】:

      【解决方案4】:

      这里有一个解决方案:

      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"]
      

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 2020-02-17
        • 2017-10-07
        • 2016-07-18
        • 1970-01-01
        • 2013-05-14
        相关资源
        最近更新 更多