附加哈希值时遇到问题 ruby
trouble appending hash value ruby
我正在编写一个程序,它接受输入,将其存储为散列并对值进行排序。
我在将当前哈希值与变量进行比较时遇到问题。
示例输入:
3
一个 1
B 3
C 5
一个 2
B 7
C 2
示例输出:
A 1 2
B 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}"
}
这将是一种更 Ruby-ish 的代码编写方式:
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
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[] << 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
我正在编写一个程序,它接受输入,将其存储为散列并对值进行排序。
我在将当前哈希值与变量进行比较时遇到问题。
示例输入:
3
一个 1
B 3
C 5
一个 2
B 7
C 2
示例输出:
A 1 2
B 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}"
}
这将是一种更 Ruby-ish 的代码编写方式:
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
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[] << 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