3

次のコードを使用して、Greedyalgorithimをrubyに実装しました。

class Greedy
  def initialize(unit, total, *coins)
    @total_coins1 = 0
    @total_coins2 = 0
    @unit = unit
    @total = total
    @reset_total = total
    @currency = coins.map 
    @currency.sort!
    @currency = @currency.reverse
    unless @currency.include?(1)
      @currency.push(1)
    end
  end
  def sorter
    @currency.each do |x|
      @pos = @total / x
      @pos = @pos.floor
      @total_coins1 += @pos
      @total -= x * @pos
      puts "#{@pos}: #{x} #{@unit}"
    end
    puts "#{@total_coins1} total coins"
  end
end

コードを実行しようとすると:

x = Greedy.new("cents", 130, 50, 25, 10, 5)

エラーが発生します:

NoMethodError: undefined method `sort!' for #<Enumerator: [50, 25, 10, 5]:map>
    from /Users/Solomon/Desktop/Ruby/greedy.rb:9:in `initialize'
    from (irb):2:in `new'
    from (irb):2
    from /Users/Solomon/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'

Rubyは非常に新しいので、これが何を意味するのか、またそれを修正する方法もわかりません[50, 25, 10, 5].sort!。完全に有効な方法だからです...このエラーを修正するにはどうすればよいですか?

4

2 に答える 2

8

あなたの問題はここにあります:@currency = coins.map

mapブロックなしで呼び出すと、が返されEnumeratorます。ここで何をマッピングしたかったのですか?の値で何もしたくない場合は、とステップをcoins割り当て@currency = coins.sort.reverseて保存してください。sort!reverse

于 2012-05-02T13:41:09.430 に答える
1

列挙子にはソート メソッドがありません。Enumerable に属します。ブロックのない Map メソッドは、列挙子を返します。

あなたの例では、すでに * splatten 演算子を使用しているため、coins は既に配列になっています。ただし、強制的に変換することを主張する場合は、使用できます

@currency  = coins.to_a
@currency = @currency.sort!

または、次のように短縮します。

@currency = coins.to_a.sort

to_a メソッドはそれを配列に変換し、次と同等になります。

coins = coins.map{|x| x}
于 2012-05-02T14:05:31.160 に答える