【问题标题】:Ruby - code to determine the most common characterS(plural) in a string [duplicate]Ruby - 确定字符串中最常见字符S(复数)的代码[重复]
【发布时间】:2018-02-16 00:50:15
【问题描述】:

那些将其标记为重复的人 - 认真地,尝试更加负责任。您标记为相同的问题与我提出的问题完全不同。我已经得到了一个很好的答案,对于类似主题的任何问题都没有。

我原来的问题:

我看到很多人问如何在字符串中找到最常见的字母。我的代码如下。但我想知道如何获得多个答案以返回。也就是说,如果有几个字母与最常见的计数相同,我如何让我的方法只返回这些字母和所有字母?

def ltr(string)
  results = string.scan(/\w/).reduce(Hash.new(0)) {|h,c| h[c] += 1; h}
  sorted = results.sort_by{|key,value| value}
  sorted[-1]
end

例如,如果我在这个方法中输入的字符串是(“哦,我多么讨厌早上起床”)......那么每个字母 'h'、'o' 和 ' 有 4 个t'。我当前的方法只返回计数为“4”的“t”。如何让其他人也被退回?

注意:在决定将问题标记为重复问题之前,请仔细阅读问题。被建议为可能重复的问题只是显示了如何计算字符的频率,而不是如何让它只返回最常见的那些。马特的回答很完美。

【问题讨论】:

  • 你想计算字符串中的字符/字母吗?
  • scan(/\w/) 好像和chars 一样。
  • @SagarPandya:不,scan(/./) 与chars 相同(只是更慢)。例如,scan(/\w/) 不会接收空格或标点符号。

标签: ruby counting multiple-return-values


【解决方案1】:

你的答案很好。继续遍历生成的数组,只保留计数与第一项的计数一样高的元素:

def ltr(string)
  results = string.scan(/\w/).reduce(Hash.new(0)) {|h,c| h[c] += 1; h}
  sorted = results.sort_by{|key,value| value}.reverse
  top = sorted[0][1]
  sorted.take_while{|key,value| value == top}
end

【讨论】:

  • 感谢马特,这太完美了。我还没有了解 take_while 方法。很有用!
  • 只是好奇,那个'top'变量发生了什么?为什么有必要在“排序”之后放置两个位置“[0][1]”?这如何允许超过 2 个答案,例如我们示例中的 3?它们代表每个答案的键和值吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多