Вопрос:

Содержит ли один массив один и тот же элемент с другим массивом

ruby

53 просмотра

1 ответ

5 Репутация автора

Я пытаюсь воссоздать «вдохновителя», обрабатывая пять букв слова вместо цветов.

Допустим, у меня есть пятибуквенное слово, "Alice"и я разбиваю его на массив с именем answer_array. Затем я предлагаю пользователю ввести пятибуквенное слово, а затем оно разбивается на guess_array. Я пытаюсь сравнить, если guess_arrayсодержит какие-либо одинаковые буквы в answer_array, и если да, он вернется с соответствующей обратной связью.

Это то, что я пытаюсь достичь:

guess_array.each { |x| puts guess_array[x] == answer_array[x]}

Однако он отправляет сообщение об ошибке:

StringTest.rb:18:in `[]': no implicit conversion of String into Integer (TypeError)
    from StringTest.rb:18:in `block in <main>'
    from StringTest.rb:18:in `each'
    from StringTest.rb:18:in `<main>'
Автор: Corbin Willis Источник Размещён: 08.11.2017 11:28

Ответы (1)


0 плюса

530 Репутация автора

Решение

Вы можете получить массив, который содержит только общие элементы двух массивов, используя &оператор (или set intersection) :

> [1, 2, 3] & [2, 3, 4]
=> [2, 3]

> [1,2,3] & [4,5,6]
=> []

Если вам не нужно возвращать фактические общие значения, просто проверьте пустоту на пересечении и получите логическое значение:

> ([1,2,3] & [4,5,6]).any?
=> false
> ([1,2,3] & [3,5,6]).any?
=> true

Что касается ошибки, которую вы в настоящее время получаете: то, что фактически делает ваш код, выполняет итерацию по каждому элементу guess_array, где внутренняя переменная в блоке на каждой итерации x- это сам элемент массива. xэто не индекс, это строковое значение в вашем случае. Посмотри:

> ['a', 'b', 'c'].each{ |s| puts s }
a
b
c
=> ["a", "b", "c"]

Очевидно, что-то вроде my_array['a']не сработает.

Если вы хотите перебрать и значение, и индекс, вы можете вызвать each_with_index:

> ['a','b','c'].each_with_index{ |s, i| puts "value is #{s} and index is #{i}" }
value is a and index is 0
value is b and index is 1
value is c and index is 2
=> ["a", "b", "c"]

И это позволит вам выполнять поиск на основе текущего индекса массива в каком-либо другом массиве. Но для вашей конкретной проблемы это, вероятно, не лучшее решение - используйте пересечение множеств.

Автор: jk_ Размещён: 08.11.2017 11:49
Вопросы из категории :
32x32