麻烦附加哈希值ruby

时间:2017-02-03 12:34:06

标签: ruby hash append concat

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

我无法将当前哈希值与变量进行比较。

示例输入:
3
A 1
B 3
C 5
A 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}"
}

有人可以帮帮我吗?非常感谢。

3 个答案:

答案 0 :(得分:1)

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

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),而不是您的变量#39} ; ve声明名为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}" 
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这将是一种更加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