我正在尝试比较哈希和数组,以便在ruby中进行测试。散列保存要比较的值,数组保存要测试的结果。数组和哈希具有相同数量的元素,并且数组的相应元素应与哈希中的元素匹配。例如,数组的第一个插槽需要匹配第一个哈希值,然后数组和哈希都应增加到下一个值和数组插槽,以查看它们是否匹配。基本上,hash[0]
和array[0]
需要匹配,hash[1]
和array[1]
需要匹配,等等。
例如:
hash = {1 => 100, 2 => 101, 3 => 102, 4 => 103}
array = [100, 101, 102, 103]
hash[0]
和array[0]
需要匹配,如果不匹配,那就是错误。但是我不在乎hash[0]
是否与array[1-3]
匹配,或者array[0]
是否与hash[1-3]
匹配。 hash[1]
和array[1]
需要匹配,但是我不在乎hash[1]
是否与array[0, 2, 3]
匹配,或者array[1]
是否与hash[0, 2, 3]
匹配。那就是我需要的要点。
假设我有这个:
hash = {1 => 100, 2 => 101, 3 => 102, 4 => 103}
array = [100, 103, 102, 103]
hash[1]
和array[1]
不匹配,所以是错误的。但是我不在乎array[1]
和hash[3]
是否匹配。
我的代码遇到的问题是,当我只关心对应的哈希值(hash[0]
和array[0]
时,它会经历并将第一个哈希值与数组中的所有槽进行比较。在移动到下一个对(hash[0]
和array[0]
)之前,如何格式化我的代码以仅比较每个对应的哈希值和数组值(hash[1]
和array[1]
)?
这是我到目前为止所拥有的。
hash.each do |key, value|
array.each do |slot|
if slot.include? value
puts "Key: #{key}"
puts "Test Pass"
else
puts "Test Fail"
end
end
end
答案 0 :(得分:1)
给出一个哈希...
hash = {1 => 100, 2 => 101, 3 => 102, 4 => 103}
您可以使用.values
以插入顺序获取该哈希中的值:
hash.values # => [100, 101, 102, 103]
在这一点上,您可以使用简单的相等性来测试值是否等于您的数组:
hash = {1 => 100, 2 => 101, 3 => 102, 4 => 103}
array = [100, 101, 102, 103]
hash.values == array # => true
这取决于哈希中键的插入顺序。根据散列的构造方式,您可能需要依赖键的排序顺序,例如:
hash = {4 => 103, 2 => 101, 3 => 102, 1 => 100 }
hash.values # => [103, 101, 102, 100]
如果意图是根据相应的键将值升序,则可以将散列转换为[key, value]
对的数组,并根据键进行排序:
hash = {4 => 103, 2 => 101, 3 => 102, 1 => 100 }
hash.to_a # => [[4, 103], [2, 101], [3, 102], [1, 100]]
hash.to_a.sort(&:first) . # => [[1, 100], [2, 101], [3, 102], [4, 103]]
hash.to_a.sort(&:first).map(&:last) # => [100, 101, 102, 103]
hash.to_a.sort(&:first).map(&:last) == array # => true
如果您的哈希键始终是从1
开始的连续升序数字,那么您可以采用完全不同的方法遍历数组,对于每个数组索引,请比较hash[index + 1]
处的值:
hash = {1 => 100, 2 => 101, 3 => 102, 4 => 103}
array = [100, 101, 102, 103]
array.each.with_index(1).all? { |item, index| item == hash[index] } # => true