我需要计算频率和百分比的帮助,我需要按最频繁的顺序排列,不带引号和大括号等

I need help calculating the frequency and percentage, I need it in order of most frequent and without the quotation marks & curly brackets etc

我一直在使用一个网站来计算频率,但他们最多有 50,000 个字符,现在我需要自己做,这真的是我从一开始就应该做的。

   let frequencyCount = Dictionary(grouping: numbers) { [=10=] }
        .mapValues{ [=10=].count }

   mostFrequentTextView.text = String(format:"%@", frequencyCount)


   let numbers = [

    "1, 2, 3, 4",
    "5, 6, 7, 8",
    "3, 4, 5, 6",
    "1, 2, 7, 8",
    "1, 2, 3, 4",
    "3, 4, 5, 6",
    "1, 2, 3, 4",
    "1, 2, 3, 4",
    "5, 6, 7, 8",
    "3, 4, 5, 6",
    "1, 2, 7, 8",
    "1, 2, 3, 4",
    "3, 4, 5, 6",
    "1, 2, 3, 4" ]

//当前结果↓

          {
     "1, 2, 3, 4" = 6;
     "1, 2, 7, 8" = 2;
     "3, 4, 5, 6" = 4;
     "5, 6, 7, 8" = 2;
          }

//想要的结果↓

      1, 2, 3, 4   X 6   43%

      3, 4, 5, 6   X 4   29%

      1, 2, 7, 8   X 2   14%

      5, 6, 7, 8   X 2   14%

分组后,您可以使用 sortedreduce 构建输出

let output = frequencyCount.sorted(by: {[=10=].value > .value}).reduce(into: "") {
    let fraction =  Int(round(100.0 * Double(.value) / Double(numbers.count)))
    [=10=] += "\(.key)   X \(.value)  \(fraction)%\n"
}

输出

1, 2, 3, 4   X 6  43%  
3, 4, 5, 6   X 4  29%  
1, 2, 7, 8   X 2  14%  
5, 6, 7, 8   X 2  14%

如果你喜欢String.format()

let fraction = round(100.0 * Double(.value) / Double(numbers.count))
[=12=] += String(format: "%@   X %d  %.0f%%\n", .key, .value, fraction)

如果您想将所有内容放在一起,请完成代码

let total = Double(numbers.count)
let output = Dictionary(grouping: numbers) { [=13=] }
    .mapValues{ [=13=].count }
    .sorted(by: {[=13=].value > .value})
    .reduce(into: "") {
        [=13=] += "\(.key)   X \(.value)  \(Int(round(100.0 * Double(.value) / total)))%\n"
    }