我正在编写一个程序,该程序接受输入,将其存储为哈希并对值进行排序。
我在将当前哈希值与变量进行比较时遇到问题。
示例输入:
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
,因为它使用新值两次,而不是原始值。
话虽如此,您的代码仍然很难读起来很混乱......你的变量是size
、i
、text
、val
、values
、key
和keys
。如果没有其他:),使用更清晰的变量名称会更容易理解
下面是一个略微改进的版本,无需更改代码的整体结构:
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