如何在ruby中循环哈希并确定最终值

如何在ruby中循环哈希并确定最终值,ruby,Ruby,我有一个这样打印的变量: {:type1=>:poor, :type2=>:avg, :type3=>:best} 我想迭代这个散列并根据以下规则打印出最终值 如果任何类型的值为:best,则最终值为best 如果任何类型的值为:avg,并且没有最佳值,则最终值为avg 否则最终值为poor 基本上最强者获胜 我尝试了以下几点 def final_value(values) val = "poor" values.each do |key, val| end

我有一个这样打印的变量:

{:type1=>:poor, :type2=>:avg, :type3=>:best}
我想迭代这个散列并根据以下规则打印出最终值

  • 如果任何类型的值为
    :best
    ,则最终值为
    best
  • 如果任何类型的值为
    :avg
    ,并且没有
    最佳值
    ,则最终值为
    avg
  • 否则最终值为
    poor
基本上最强者获胜

我尝试了以下几点

def final_value(values)
  val = "poor"
  values.each do |key, val|

  end
  val
end
像这样的东西

final_val = :poor
values.each() do |val|
    if val = :avg && final_val = :poor
        final_val = :avg
    end
    if val = :best && final_val = :avg
        final_val = :best
    end
end
return final_val
像这样的东西

final_val = :poor
values.each() do |val|
    if val = :avg && final_val = :poor
        final_val = :avg
    end
    if val = :best && final_val = :avg
        final_val = :best
    end
end
return final_val

使用哈希的has\u值?方法

val = :poor;
val = :avg  if values.has_value?(:avg);
val = :best if values.has_value?(:best);
val

使用哈希的has\u值?方法

val = :poor;
val = :avg  if values.has_value?(:avg);
val = :best if values.has_value?(:best);
val

您可以通过以下方式实现所需:

def final_value(values)
    val = :poor;
    values.each do|k, v|
        if(v==:best)
            val=:best;
            break;
        elsif(val==:poor && v==:avg)
            val=:avg;
        end
    end
    puts "Final value is: "+val.to_s;
end

values = {:type1=>:poor, :type2=>:avg, :type3=>:best};
final_value(values)

您可以通过以下方式实现所需:

def final_value(values)
    val = :poor;
    values.each do|k, v|
        if(v==:best)
            val=:best;
            break;
        elsif(val==:poor && v==:avg)
            val=:avg;
        end
    end
    puts "Final value is: "+val.to_s;
end

values = {:type1=>:poor, :type2=>:avg, :type3=>:best};
final_value(values)

你也有符号
:poor
等,但你写的时候好像有变量/方法
poor
等。然后,你甚至提到字符串
“poor”
等。我只是把它们当作循环中的字符串,即使它们是符号。你也有符号
:poor
等,但是你写的时候好像有变量/方法
poor
等等。然后,你甚至提到字符串
“poor”
等等。我只是把它们当作循环中的字符串,即使它们是符号+1个好答案-事实上,迭代是不必要的!您可以通过先查找
best
来稍微改进它,因为在
has\u value的实现中,您可能不需要查找
avg
@alfa?
方法进行迭代。迭代是必要的,这只是一个显式或隐式迭代的问题。@AlexWayne我想你明白我的意思了,不是吗?:)以防万一:我将它与cainy393的答案进行了比较——我的意思是没有必要实现迭代,因为Ruby使用
has\u value?
为您实现迭代。“隐式”方法更优雅——这就是我的意思。顺便说一句,如果实现更改为持有“相反”哈希(其中值指向布尔值“true”)的话,实际上不需要迭代——可以在O(1)中完成。我认为没有实现它的原因是为了不浪费内存空间,这是一个很好的理由。只是一个想法。+1个好答案-事实上,迭代是不必要的!您可以通过先查找
best
来稍微改进它,因为在
has\u value的实现中,您可能不需要查找
avg
@alfa?
方法进行迭代。迭代是必要的,这只是一个显式或隐式迭代的问题。@AlexWayne我想你明白我的意思了,不是吗?:)以防万一:我将它与cainy393的答案进行了比较——我的意思是没有必要实现迭代,因为Ruby使用
has\u value?
为您实现迭代。“隐式”方法更优雅——这就是我的意思。顺便说一句,如果实现更改为持有“相反”哈希(其中值指向布尔值“true”)的话,实际上不需要迭代——可以在O(1)中完成。我认为没有实现它的原因是为了不浪费内存空间,这是一个很好的理由。只是一个想法。