一个数组是否包含与另一个数组相同的元素

时间:2017-11-08 23:28:34

标签: ruby

我正在尝试重新制作' mastermind',处理五个字母而不是颜色。

我有一个五个字母的单词,比方说"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>'

1 个答案:

答案 0 :(得分:0)

您可以使用& (or set intersection) operator获取一个仅包含两个数组的公共元素的数组:

> [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"]

这将允许您根据某些其他数组中的数组的当前索引执行查找。但对于您的特定问题,这可能不是最佳解决方案 - 使用集合交集。