簡體   English   中英

如何針對 ruby​​ 中的列表搜索用戶輸入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM