2016-04-23 95 views
0

目標是取一個字符串並返回最常見的字母及其數量。對於字符串'hello',它將返回['l', 2]爲什麼`String#delete`在我的ruby代碼中返回錯誤?

我寫了以下內容:

def most_common_letter(string) 
list = [] 
bigcount = 0 
while 0 < string.length 
    count = 0 
    for i in 0..string.length 
     if string[0] == string[i] 
      count += 1 
     end 
    end 
    if count > bigcount 
     bigcount = count 
     list = (string[0]) 
     string.delete[string[0]] 
    end 
end 
return [list,bigcount] 
end 

我得到以下錯誤:

wrong number of arguments (0 for 1+) 
(repl):14:in `delete' 
(repl):14:in `most_common_letter' 
(repl):5:in `initialize' 

請幫助我瞭解我在做什麼毛病delete聲明,或還有什麼導致這返回一個錯誤。

我以另一種方式完成解決方案,但我認爲這將工作得很好。

回答

3

您使用的是delete功能失常

使用string.delete(string[0]),而不是string.delete[string[0]]

編輯

至於你提到的無限循環。 您的狀態爲0 < string.length

而且您期望string.delete[string[0]]語句一次實際刪除一個字符。

但是它究竟做了什麼,它刪除了一個字符並返回新的字符串,但它實際上並沒有改變/改變實際的字符串。

因此,嘗試將其更改爲string = string.delete[string[0]]

+0

善良! 我很粗心。謝謝你指出。你看到任何有無限循環的地方嗎?我沒有得到理想的結果。控制檯不會返回任何信息 – hac13

+0

我剛剛將刪除語句移到了第三個「結束」的下方,但它似乎仍然在循環中 – hac13

+0

我不能夠感謝你。這很像魔術!謝謝你幫助我理解 – hac13

0

你可以這樣做在一個更簡單的方法,如果你讓我說。

def most_common_letter(string) 
    h = Hash.new 
    string.chars.sort.map { |c| 
    h[c] = 0 if (h[c].nil?) 
    h[c] = h[c] + 1 
    } 
    maxk = nil 
    maxv = -1 
    mk = h.keys 
    mk.each do |k| 
    if (h[k] > maxv) then 
     maxk = k 
     maxv = h[k] 
    end 
    end 
    [ maxk , maxv ] 
end 

如果你測試這個與

puts most_common_letter("alcachofra") 

結果將是

[ 'a', 3 ] 

最後,記住你不需要在Ruby方法的最後一個回報。最後分配的值會自動返回。

以Ruby的方式做Ruby!

+1

這是一個有趣的方式。我沒有遇到你在那裏的'哈希'部分。這是一件很酷的事情要記住。關於最後的回報聲明 - 這只是我特別小心哈哈,但我會習慣這一點。編程新手 – hac13

+0

我編輯的時間更短。如果我不斷思考,我相信它會更短。我的建議,因爲你是編程新手,所以看看Ruby文檔,並瞭解有關數組和散列的方法。它有很多幫助。數組:http://docs.ruby-lang.org/en/2.0.0/Array.html散列:http://docs.ruby-lang.org/en/2.0.0/Hash.html –

+1

謝謝先生。是的,我意識到代碼可以不斷編輯和優化,但我到目前爲止只是在練習問題並從中學習。我會仔細查看這些鏈接,並希望能夠熟練掌握這一點! – hac13

1

除了使用delete()代替delete[]這已經回答了...

你最需要的Ruby的String類實現原生的東西。 each_charcount

def most_common_letter(string) 
    max = [ nil, 0 ] 
    string.each_char {|char| 
    char_count = string.count(char) 
    max = [ char, char_count ] if char_count > max[1] 
    } 
    return max 
end 
+1

添加到我的筆記!感謝你 - 另一件值得記住的好事。我想我以前曾經遇到過,但不太清楚如何使用它。我剛開始使用'for'語句代替'while'語句lol – hac13

+1

不用擔心,您可能需要['downcase'](http://ruby-doc.org/core-2.2.0/String.html#方法 - 我 - 小寫),這取決於你的用例。 – Matt

+1

哈哈,真是太棒了。有時我會想到這樣的方法(如果這就是他們所稱的),我想知道如何找到它們(上面評論中的一個好人提到了Ruby文檔,現在我知道如何釣魚了)。我正在從App Academy的準備工作中學習。到目前爲止,這個地方對我來說非常棒。謝啦!目標是做職業轉換 – hac13

相關問題