附加哈希值红宝石时遇到问题



我正在编写一个程序,该程序接受输入,将其存储为哈希并对值进行排序。

我在将当前哈希值与变量进行比较时遇到问题。

示例输入:

3一 1
乙 3
C 5
一 2
乙 7
C 2

示例输出:

一 1 2
乙 3 7
C 2 5

除了这部分之外,一切都有效,我不确定为什么。

 if values.key?(:keys)
        if values[keys] >= val
              values.store(keys,val.prepend(val + " "))
        else
              values.store(keys,val.concat(" " + val))
        end
      else
        values.store(keys,val)
    end
      i = i + 1
    end

其余代码:

#get amount of records
size = gets.chomp
puts size
size = size.to_i
values = Hash.new(0)
i = 0
while i < (size * 2)
  text = gets.chomp
#split string and remove space
  keys = text.split[0]
  val = text.split[1]
#check if key already exists,
# if current value is greater than new value append new value to end
# else put at beginning of current value
  if values.key?(:keys)
    if values[keys] >= val
          values.store(keys,val.prepend(val + " "))
    else
          values.store(keys,val.concat(" " + val))
    end
  else
    values.store(keys,val)
end
  i = i + 1
end
#sort hash by key
values = values.sort_by { |key, value| key}
#output hash values
values.each{|key, value|
    puts "#{key}:#{value}"
}

谁能帮我?将不胜感激。

简短的回答是你的代码中有两个错误。这是固定版本:

if values.key?(keys) 
  if values[keys] >= val 
    values.store(keys,values[keys].prepend(val + " ")) 
  else 
    values.store(keys,values[keys].concat(" " + val)) 
  end 
else 
  values.store(keys,val) 
end
  • if语句的计算结果始终为 false,因为您正在寻找名为 :keys 的哈希键(这是一个Symbol),而不是您声明的名为 keys 的变量。
  • 即使修复了这个问题,还有第二个隐藏的错误:您存储了不正确的新哈希值。 val.concat(" " + val)会给你像A 2 2这样的结果,而不是A 1 2,因为它使用新值两次,而不是原始值。

话虽如此,您的代码仍然很难读起来很混乱......你的变量是sizeitextvalvalueskeykeys。如果没有其他:),使用更清晰的变量名称会更容易理解

下面是一个略微改进的版本,无需更改代码的整体结构:

puts "How may variables to loop through?" 
result_length = gets.chomp.to_i 
result = {} 
puts "Enter #{result_length * 2} key-value pairs:" 
(result_length * 2).times do 
  input = gets.chomp 
  input_key = input.split[0] 
  input_value = input.split[1] 
  #check if key already exists, 
  # if current value is greater than new value append new value to end 
  # else put at beginning of current value 
  if result.key?(input_key) 
    if result[input_key] >= input_value 
      result[input_key] = "#{input_value} #{result[input_key]}" 
    else 
      result[input_key] = "#{result[input_key]} #{input_value}" 
    end 
  else 
    result[input_key] = input_value 
  end 
end 
#sort hash by key 
result.sort.to_h 
#output hash result 
result.each{|key, value| 
  puts "#{key}:#{value}" 
}
h = Hash.new { |h,k| h[k] = [] }
input = ['A 1', 'B 3', 'C 5', 'A 2', 'B 7', 'C 2'].join("n")
input.each_line { |x| h[$1] << $2 if x =~ /^(.*?)s+(.*?)$/ }
h.keys.sort.each do |k|
  puts ([k] + h[k].sort).join(' ')
end
# A 1 2
# B 3 7
# C 2 5

这将是编写代码的一种更像 Ruby 的方式:

input = "A 1
B 3
C 5
A 2
B 7
C 2"
input.scan(/[A-Z]+ d+/)
     .map{ |str| str.split(' ') }
     .group_by{ |letter, _| letter }
     .each do |letter, pairs|
  print letter
  print ' '
  puts pairs.map{ |_, number| number }.sort.join(' ')
end
#=> 
# A 1 2
# B 3 7
# C 2 5

最新更新