比较哈希与Ruby中的数组

时间:2018-09-27 16:12:57

标签: arrays ruby hashtable

我正在尝试比较哈希和数组,以便在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 

1 个答案:

答案 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