2015-09-15 3 views
-4

По этим линиям, я получил два массива:Как получить доступ и сравнить два массива

@correct_answer = Question.pluck(:correct_answer) 
# => [1, 1, 2, 2, 1, 1, 3, 1, 3] 
@selected_answer = Question.pluck(:selected_answer) 
# => [1, 4, 3, 1, 1, 3, 4, 1, 1] 

Как я могу сравнить значения в этих двух массивах один за другим? Я использую этот код:

if @correct_answer[0] == @selected_answer[0] 
    @result += 1 
else 
    @result -= 1 
end 

но это не работает.

+1

Это бессмысленно, если вы не предоставили заказ на получение значений, не так ли? –

+0

Какой результат вы хотите от этого? –

+0

Я хочу, когда значения равны, добавьте +1 в результат else -1 в результате –

ответ

0

Вы можете попробовать это.

@selected_answers = [1, 4, 3, 1, 1, 3, 4, 1, 1] 
@correct_answers = [1, 1, 2, 2, 1, 1, 3, 1, 3] 

## This will return count of all matched and unmatched values. 
@selected_answers.each_with_index do |selected_answer, index| 
    if selected_answer == @correct_answers[index] 
    @result += 1 
    else 
    @result -= 1 
    end 
end 

## This will return count of only matched values. 
@selected_answers.each_with_index do |selected_answer, index| 
    @result += 1 if selected_answer == @correct_answers[index] 
end 
+0

thats не работает, это дает мне эту ошибку –

+0

undefined method' each_with_index 'для nil: NilClass –

+0

Пожалуйста, вставьте значение '@ selected_answers' –

1

Вот одно из возможных решений

a1 = [1, 1, 2, 2, 1, 1, 3, 1, 3] 
a2 = [1, 4, 3, 1, 1, 3, 4, 1, 1] 

a1.zip(a2).inject(0) do |result, (correct, selected)| 
    result += (correct == selected ? 1 : -1) 
end 
# => -3 

Объяснение:

  • с zip слиянии a1 и a1 в одном массиве.
  • вы используете inject на карту и уменьшить массив, начиная с базового значения 0
  • если матч значения, вы добавляете +1, иначе -1
+0

, но thats дают мне только 0 вывод –

+1

Может быть, проще отделить карту и уменьшить шаги, то есть 'a1.zip (a2) .map {| x, y | x == y? 1: -1} .inject (: +) ' – Stefan

+0

Я хочу объединить каждый элемент один за другим друг с другом –

2

EDIT: Вы можете рассчитывать правильный ответ таким образом:

correct_score = correct_answer.zip(selected_answer).count { |correct, wrong| correct == wrong } 
# => 3 
wrong_score = selected_answer.size - correct_score 
# => 6 
total_score = correct_score - wrong_score 
# => -3 

Вы также можете узнать, какие значения совпадают по этому коду:

correct_answer = [1, 1, 2, 2, 1, 1, 3, 1, 3] 
# => [1, 1, 2, 2, 1, 1, 3, 1, 3] 
selected_answer = [1, 4, 3, 1, 1, 3, 4, 1, 1] 
# => [1, 4, 3, 1, 1, 3, 4, 1, 1] 
correct_answer.zip(selected_answer).map do |correct, selected| 
    correct == selected ? 'Correct!' : "Wrong! Correct answer is: #{correct}" 
end 
# => ["Correct!", "Wrong! Correct answer is: 1", "Wrong! Correct answer is: 2", "Wrong! Correct answer is: 2", "Correct!", "Wrong! Correct answer is: 1", "Wrong! Correct answer is: 3", "Correct!", "Wrong! Correct answer is: 3"] 
0
@result = 0 
@correct_answer = Question.pluck(:correct_answer) 
@selected_answer = Question.pluck(:selected_answer) 
@selected_answer.each_with_index do |selected_answer, index| 
    @result += 1 if selected_answer == @correct_answer[index] 
end 

Этот код работает на меня благодаря Amit sharma.

+0

Вместо дублирования ответа вы должны повысить полезность и отметить ответ, который лучше подходит для вашей проблемы, как принято. – Doguita