2

私はChris Pine のチュートリアルの第 7 章で独自のアルファベット検索を作成しようとしましたが、バイナリ メソッドを実装する必要がありました。文字列入力には有効性がないため、整数と文字列が混在するとどうなるかわかりませんが、文字列のリストのみに対してそれを行うという考えでした。

#get list of strings
puts "type words to make a list. type 'exit' to leave program."
x = ()
list = []
while x.to_s.upcase != 'EXIT'
    x = gets.chomp
    list.push(x)
end 
list.pop

#binary method

nano = list.length
half= list.each_slice(nano/2).to_a
left = half[0]
right = half[1]

nanol=left.length
nanor=right.length

#initialize results array

A = []

for i in 0..nano-1
    smallest_left = left.min
    smallest_right = right.min

        #no difference with this commented out or not
    #if nanol==0
    #    A<<smallest_right
    #end
    #if nanor==0
    #    A<<smallest_left
    #end

        #error message points to the line below (rb:44)
    if smallest_left<smallest_right
        A << smallest_left
        print A
        left.pop[i]
    elsif smallest_left>smallest_right
        A << smallest_right
        print A
        right.pop[i]
    else
        print A
    end
end

入力 = ['z','b','r','a'] の場合、リストがエラーでソートされていることがわかります。

["a"]["a", "b"]["a", "b", "r"] rb:44:in `<': comparison of String with nil failed (ArgumentError)

私のエラーを見るのを手伝ってください:) よろしくお願いします!

4

1 に答える 1

1

nil を比較しようとしているため、例外が発生しています。nil が左側にある場合、別の例外が発生します。

'1' < nil
#=> scratch.rb:1:in `<': comparison of String with nil failed (ArgumentError)

nil > '1'
scratch.rb:1:in `<main>': undefined method `>' for nil:NilClass (NoMethodError)

leftorright配列が空の場合 (つまり、すべての要素が既に A に追加されている場合) 、コードはこの状況に陥ります。nanol == 0おそらく、これが最初にandの if ステートメントを追加した理由ですnanor == 0(つまり、配列の 1 つが空の場合に処理するため)。

if ステートメントにはいくつかの問題があります。

  1. nanol == 0andnanor == 0ステートメントが必要です
  2. 反復で適用されるのは 1 つだけですが、3 つの if ステートメントは常に実行されます。
  3. nanolnanor再計算されることはありません (つまり、ゼロになることはありません) 。
  4. 左右の値が等しい場合、実際にはA配列に何も追加しません

反復の内部は次のようになります。

smallest_left = left.min
smallest_right = right.min

nanol=left.length
nanor=right.length  

if nanol == 0   #Handles left no longer having values
    A << right.delete_at(right.index(smallest_right) || right.length)
elsif nanor == 0    #Handles right no longer having values
    A << left.delete_at(left.index(smallest_left) || left.length)
elsif smallest_left < smallest_right
    A << left.delete_at(left.index(smallest_left) || left.length)
elsif smallest_left > smallest_right
    A << right.delete_at(right.index(smallest_right) || right.length)
else #They are equal so take one
    A << left.delete_at(left.index(smallest_left) || left.length)
end

リストに奇数の要素が含まれている場合でも、問題が発生します (エラーは発生しませんが、予期しない結果になります)。しかし、うまくいけば、それはあなたの質問に答えます。

于 2013-01-30T03:25:16.860 に答える