【问题标题】:Is there a way to compare two arrays and return a new array of the common elements which have the same index?有没有办法比较两个数组并返回具有相同索引的公共元素的新数组?
【发布时间】:2021-11-08 19:24:52
【问题描述】:

例如

a = [2,3,1,1]
b = [2,7,4,2]

--> c = [2]

我的解决方案是:

c = b.select do
    |em| b.index(em) == a.index(em)
    end

但如果我将它应用到给定的示例,它会返回

c = [2,2]

【问题讨论】:

  • 我认为这个问题可以通过几种方式来解读。期望的输出是什么?
  • @JakeWorth:我认为他们正在尝试实现"bulls and cows" game
  • @JakeWorth 我正在寻找一种方法,它返回一个包含两个给定数组之间的公共元素的数组,当且仅当这些元素在它们各自的数组中也共享相同的索引时。我的解决方案在大多数情况下都可以正常工作,但是当 b 数组包含公共元素的副本时会出现问题。在这种情况下,即使该副本与共享索引的 a 数组的值不同,select 方法也会返回副本。我希望我已经很全面了。
  • 这个问题通常说得很好,但不清楚如果a = [1,1]b=[1,1] 需要什么返回值。我认为索引数组可能是更有用的返回值。

标签: arrays ruby


【解决方案1】:
a = [2,3,1,1]
b = [2,7,4,2]
c = b.select do |em|
  b.index(em) == a.index(em)
end

b.select do |em| 采用 b 的第一个元素(即 2)。 b.index(em) 找到第一个包含 2 的索引,即 first 索引。 (索引 0)。由于数组 a 在同一索引上有一个 2,因此整个块为真并且元素 2 被选中。但同样的故事也适用于最后一个元素。同样,搜索 b 数组,并在索引 0 处找到 first 2。因此,也选择了该 2。

a.each_with_index.to_a & b.each_with_index.to_a

会给你常见的元素和它们的索引。

【讨论】:

  • 请记住,该问题不要求索引。虽然它们可以很容易地从返回值中剥离,但使用索引不一定是最好的方法。
【解决方案2】:

由于您想逐个元素地比较数组,zip 将是一个很好的选择。

a.zip(b) # => [[2, 2], [3, 7], [1, 4], [1, 2]]

a.zip(b).select {|a1, b1| a1 == b1}.map(&:first) # [2]

# or in ruby 2.7+
a.zip(b).filter_map {|a1, b1| a1 == b1 && a1} # [2]

【讨论】:

  • 谢谢!正是我想要的!
  • 只是为了好玩,在向Array 添加一个:single_elem? 方法之后,测试数组的长度是否正好为1:a.zip(b).map(&:uniq).select(&:single_elem?).flatten
  • a.zip(b).filter_map { |a1, b1| a1 if a1 == b1 } 可能读得更好。或者,b.each_index.filter_map { |i| b[i] if a[i] == b[i] }.
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多