[英]how to search user input against a list in ruby?
我需要在 ruby 中創建一個簡單的程序,它可以讓我插入大量設備 IMEI 號碼列表,以檢查它們是否已被處理。 每當我運行以下代碼時,它總是以“在數據庫中未找到 IMEI”作為響應。 它將始終回復最后一行代碼。 我已經研究了幾天了,在失敗后決定現在發一個帖子。 有人可以解釋一下我做錯了什么嗎?
imei_database = ["1", "2", "3"]
puts "Enter IMEIs"
imei = gets
if imei_database.include?(imei)
puts "IMEI Found in database"
else
puts "IMEI Not Found in database"
end
您當前的代碼不使用String#chomp或其他方法從Kernel#gets 中刪除尾隨回車。 您實際上正在獲取類似"1\\n"
,因此您不會在您的imei_database數組中找到匹配項。
您還沒有對您的輸入值實施任何拆分、模式匹配或解析,因此您目前無法一次處理多個項目。 您需要遍歷根據您的輸入構建的一些集合才能做到這一點。
下面是一些替代代碼,它顯示了一種獲得所需結果的方法,但是以更加模塊化的方式。 請注意,繁重工作的核心是通過gets.chomp.split
完成的,這是一種處理多值輸入字符串的簡單方法。
class IMEI_Status
def initialize
@imei_status = {}
imei_input
end
def report
found = 'IMEI Found in Database: %s'
not_found = 'IMEI Not Found in Database: %s'
@imei_status.map do |k, v|
p((v ? found : not_found) % k)
end
end
private
def db_lookup
# stubbed response
%w[1 2 3]
end
def imei_lookup(imei)
db_lookup.include? imei
end
def imei_input
print 'Enter space-separated IMEIs: '
gets.chomp.split.each do |imei|
@imei_status[imei] = imei_lookup(imei)
end
@imei_status
end
end
# Testing, using `1 4` as user input.
status = IMEI_Status.new
status.report
#=> ["IMEI Found in Database: 1", "IMEI Not Found in Database: 4"]
當然還有其他方法可以提供類似的結果,因此您可以調整該方法以滿足您的需求。
需要換行符轉義!
imei_database = ["1", "2", "3"]
puts "Enter IMEIs"
imei = gets
imei = imei.chomp
if imei_database.include?(imei)
puts "IMEI Found in database"
else
puts "IMEI Not Found in database"
end
imei = imei.gsub("\\n","")
也有效。
如果item_database
很大,預計會有很多用戶條目並且執行速度至關重要,您應該使用適當的數據庫或首先將item_database
轉換為集合,假設有足夠的內存可用。 集合查找非常快,幾乎是恆定時間,與散列中的鍵查找相當(考慮到集合是在幕后使用散列實現的,這並不奇怪)。
require 'set'
imei_database = ["1", "2", "3"]
IMEI_DATABASE_SET = imei_database.to_set
#=> #<Set: {"1", "2", "3"}>
然后執行:
entry = gets.chomp
puts "IMEI #{entry}#{IMEI_DATABASE_SET.include?(entry) ? '' : ' Not'} Found in database"
兩個例子:
entry = "2\n".chomp
#=> "2"
puts "IMEI #{entry}#{IMEI_DATABASE_SET.include?(entry) ? '' : ' Not'} Found in database"
IMEI 2 Found in database
entry = "4\n".chomp
#=> "4"
puts "IMEI #{entry}#{IMEI_DATABASE_SET.include?(entry) ? '' : ' Not'} Found in database"
IMEI 4 Not Found in database
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.