3

我仍然是一个红宝石新手,我正在尝试学习如何准确地使用该inject方法。

通过使用该inject方法,我试图返回一个字母数组及其在给定字符串中的外观,如下所示:

def sorting(str)
  str.split("").uniq.map { |letter|
    [letter, str.split("").inject(0) { |sum, char| sum + 1 if letter == char }]
  }
end

p sorting("aaabdbbcccaaabcacba")

期望的结果应该是:

[["a", 8], ["b", 5], ["d", 1], ["c", 5]]

不幸的是,我收到一个错误:undefined method '+' for nil:NilClass.

我做错了什么,我该如何使用inject它的总和优势来解决它?

4

2 回答 2

7

使用Enumerable#group_by似乎更合适:

>> "aaabdbbcccaaabcacba".chars.group_by { |x| x }.map { |key, a| [key, a.size] }
=> [["a", 8], ["b", 5], ["d", 1], ["c", 5]]

给定代码的问题:

传递给注入的块不关心不匹配的字符。

替换sum + 1 if letter == charletter == char ? sum + 1 : sum

def sorting(str)
    str.split("").uniq.map { |letter|
        [letter, str.split("").inject(0) { |sum, char| letter == char ? sum + 1 : sum }]
    }
end
于 2013-10-26T17:58:14.763 回答
1

这是另一种方法:

s = "aaabdbbcccaaabcacba"
s.chars.uniq.map{|c|[c,s.count(c)]}
# => [["a", 8], ["b", 5], ["d", 1], ["c", 5]]
于 2013-10-26T18:08:51.363 回答