Сравнение отдельных элементов массива и хеша - PullRequest
0 голосов
/ 03 октября 2018

У меня есть следующий хеш и массив, каждый из которых содержит 8 элементов:

{1=>"2.06", 2=>"2.10", 4=>"2.00", 5=>"2.10", 6=>"2.20", 8=>"2.10", 9=>"2.10", 12=>"2.04"}

["2.06","2.10","2.00","2.10","2.20","2.10","2.10","2.04"]

Мне нужно убедиться, что каждый слот массива соответствует соответствующему значению хеша.Например, array[0] должно равняться значению hash[:1], array[1] должно равняться hash[:2] и т. Д. Я не хочу сравнивать array[0] с любым другим хеш-значением, отличным от hash[:1], array[1] к любому другому значению, кроме hash[:2], и т. Д. Значения хеш-функции и массива считываются в точном порядке на изображении, так что порядок не нужно менять.Если какая-либо из этих пар не будет совпадать, они потерпят неудачу и перейдут к следующей паре.

Я попытался создать вложенный цикл, повторяющийся в массиве и хэше.но он сравнил каждое хеш-значение с одним слотом массива, а затем перешел к следующему слоту массива и повторил (см. мой текущий выходной код).Это мой код с псевдокодом, который мне нужен:

array.each_with_index do |item, index|
  hash.each do |key, value|
    puts "Key: #{key}"
    puts "Index: #{index}"
    #if item[index] == key[:value1]
    #print pass, else print fail
    #iterate to next pair
    #if item[index+1] == key[:value2]
    #repeat
    #...
    #end 
  end
end        

Это то, что мой код выводит в настоящее время:

Key: 1
Index: 0
Key: 2
Index: 0
Key: 4
Index: 0
Key: 5
Index: 0

...

Эточто мне понадобится для вывода:

Key: 1     
Index: 0
Pass
Key: 2
Index: 1
Pass
Key: 4
Index: 2
Fail
Key: 5
Index: 3
Pass

...

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вы можете сделать что-то вроде этого

 h={1=>"2.06", 2=>"2.10", 4=>"2.00", 5=>"2.10", 6=>"2.20", 8=>"2.10", 9=>"2.10", 12=>"2.04"}
 a = ["2.06","2.10","2.00","2.10","2.20","2.10","2.10","2.04"]
 (0).upto(a.length) do |index|
    if a[index]==h[index+1]
       puts "key: #{index+1}"
       puts "index: #{index}"
       puts "Pass"
    else
      puts "key: #{index+1}"
      puts "index: #{index}"
      puts "Failed"
    end
 end
0 голосов
/ 03 октября 2018

Проблема, с которой вы сталкиваетесь в настоящее время, заключается в том, что второй цикл не нужен.

array.each_with_index do |item, index|
  hash.each do |key, value|
  #     ^ this is not needed

Вместо этого получите доступ к хешу, указав ключ на основе индекса.

# setup
hash = {1=>"2.06", 2=>"2.10", 4=>"2.00", 5=>"2.10", 6=>"2.20", 8=>"2.10", 9=>"2.10", 12=>"2.04"}
array = ["2.06","2.10","2.00","2.10","2.20","2.10","2.10","2.04"]

array.each_with_index do |array_item, index|
  key = index + 1
  hash_item = hash[key]

  puts "Key: #{key}"
  puts "Index: #{index}"
  puts array_item == hash_item ? 'Pass' : 'Fail'
end

Выше выводится то, что вы ожидаете получить.Однако если вам не нужен индекс для чего-либо, кроме доступа к хешу, вы можете сместить его на единицу, выполнив следующее:

array.each.with_index(1) do |array_item, key|
  hash_item = hash[key]
  puts "#{key}: #{array_item == hash_item}"
end

Ссылки:

0 голосов
/ 03 октября 2018

Выполнить проверку на равенство для хеш-значений и массива просто:

puts hash.values == array

Для того, что вы пытаетесь сделать, вложенный цикл не подходит (он повторяется по всему hash для каждого элемента в array вместо сравнения один к одному).Вы можете использовать zip для параллельного перебора обоих:

array.zip(hash).each_with_index do |(av, (hk, hv)), ai|
  puts "Key: #{hk}"
  puts "Index: #{ai}"
  puts av == hv ? "pass" : "fail"
end

Вывод:

Key: 1
Index: 0
pass
Key: 2
Index: 1
pass
Key: 4
Index: 2
pass
Key: 5
Index: 3
pass
Key: 6
Index: 4
pass
Key: 8
Index: 5
pass
Key: 9
Index: 6
pass
Key: 12
Index: 7
pass

Попробуйте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...