2016-04-23 9 views
0

目標は、文字列を取得して、最も一般的な文字をカウントとともに返すことです。文字列'hello'の場合は、['l', 2]を返します。Rubyコードで `String#delete`がエラーを返すのはなぜですか?

私は次のように書いている:

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

あなたが言及した無限ループのよう

利用string.delete(string[0])代わりのstring.delete[string[0]]

EDIT

間違っdelete機能を使用しています。 中止の状態は0 < string.length

となります。そして、実際にはstring.delete[string[0]]ステートメントで一度に1文字ずつ削除するとします。

しかし正確には、文字を削除して新しい文字列を返しますが、実際には実際の文字列を変更/変更することはありません。

だから、あなたは私が言うことを許可している場合は、はるかに簡単な方法でこれを行うことがstring = string.delete[string[0]]

+0

goodness! 私はとても不注意です。それを指摘していただきありがとうございます。無限ループがある部分は見えますか?私は望ましい結果を得ていない。コンソールは何も返さない – hac13

+0

私は最後の3番目の 'end'の下にdeleteステートメントを移動しましたが、それはループを維持するように見えます。 – 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で実行してください!別に、すでにあなたが必要なもののほとんどは、ネイティブRubyのStringクラスで実装されている...

に答えてきたdelete()代わりのdelete[]を使用してから

+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

each_charおよびcount

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

が追加されました!それをありがとう - 覚えておくべきもう一つの良いこと。私はそれを前に出てきたと思うが、それを使う方法があまりにも分かりませんでした。私はちょうど 'while'ステートメントの代わりに 'for'ステートメントを使用し始めました。 – hac13

+1

心配しないで、['downcase'](http://ruby-doc.org/core-2.2.0/String.html#メソッド - 私 - ダウンケース)も、あなたのユースケースに応じて。 – Matt

+1

ハハは素晴らしいです。時には私はそのようなメソッドを(それらが呼び出されている場合)考え、私はそれらを見つける方法(上記のコメントの良い人は、Rubyのドキュメントを指摘し、私は今どのように魚を知っている)。私はApp Academyの準備作業から勉強していました。これまでのところ私にとって素晴らしい場所です。ありがとう!目標はキャリア切り替えを行うことです – hac13

関連する問題