配列に項目を追加しています。それらを追加するには、アプリケーションバイナリ検索を現在の配列にします。存在する場合、項目を追加しません。項目が存在しない場合には、それが追加されます:Rubyバイナリ検索では、すでに配列に配列されている値が認識されない
while (line = fileObj.gets)
itemD = line.split(" ")
number = itemD.at(0)
name = itemD.at(1)
if (search(items, number) == -1)
# Doesn't add if item already exists
puts "Already have: #{number} - #{name}"
else
# Adds a new item to the list
items << Item.new(number, name)
end
end
以上、私のループは、ファイルからの入力を読み込み、番号と名前を取ります。その後、番号を検索します。関わらず
58 Item 1
17 Item 2
58 Item 3
76 Item 4
06 Item 5
08 Item 6
17 Item 7
21 Item 8
76 Item 4
76 Item 4
00 Item 9
49 Item 10
40 Item 11
79 Item 12
31 Item 13
:
def search(array, key)
min = 0
max = array.length-1
mid = 0
while(min <= max)
mid = lo + ((min - max)/2)
if array[mid].number == key
return -1
elsif array[mid].number < key
min = mid + 1
else
max = mid - 1
end
end
puts "#{key} not found in array"
end
私の基本的なテストケースを使用しているとき、私は問題に気づいた:上記のコードは、それが正しく動作していない以下のコード(バイナリサーチ)ですので、完全に正常に動作します別の名前、それは項目3を追加しません(すでに存在しているので、良いです)。次に、2番目のアイテム4に移動します。そのアイテムを追加しますが、3番目のアイテム4に移動し、配列にあることを通知して追加しません。
58 not found in array
17 not found in array
Already have: 58 - Item 3
76 nfia
06 nfia
08 nfia
17 nfia
21 nfia
76 nfia (WRONG)
Already have: 76 - Item 4 (CORRECT)
00 nfia
49 nfia
40 nfia
79 nfia
31 nfia
次は私が唯一の1項目、複数回のテストケースを作った:私の出力は、(問題をトレースを助けるために)以下の通りである
58 Item 1
58 Item 1
58 Item 1
58 Item 1
58 Item 1
それは正しく、最初に追加し、次のに気付き4(適切に追加しない)。それがちょうど追加された直後とは対照的に、数字がリストの後ろに現れるならば、明らかにそれ以上のことがあります。だから、次の私がテストした:
58 Item 1
08 Item 6
58 Item 1
08 Item 6
58 Item 1
08 Item 6
58 Item 1
08 Item 6
58 Item 1
08 Item 6
をこれは私が出力とを参照するが、それの興味深い反復てるものを示しています
58 nfia
08 nfia
Already have 58
08 nfia (WRONG)
58 nfia (WRONG)
already have
already have
already have
already have
already have
誰かがそれは私の中で要素を気づく理由で私を助けることができます配列は時間の一部ですが、必ずしもそうではありません。助けてくれてありがとう、私はそれを感謝します!
:
だから、私はこのような何かを示唆しています。つまり、表示されていないコードの他の部分には、私自身のソート方法もあります。だから私の目標はRubyの方法を使わないことでした。 –