如何比较两个数组的内容?

Tri*_*rip 23 ruby arrays ruby-on-rails

我正在比较邮政编码.

我有三个常用的邮政编码:

ZIP_MORRIS
ZIP_UNION
ZIP_ESSEX
Run Code Online (Sandbox Code Playgroud)

我想看看用户是否在Object的数组中,其中一个包含在其中.

我试过这个:

ZIP_UNION.sort{|x,y| y <=> x} <=> Email.find(3).distributions.map(&:zip_code).uniq.compact.sort{|x,y| y <=> x}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这只是映射了所有的邮政编码,所以如果我要在不同的县选择一个额外的邮政编码,那么就不能正确地比较它们.

我认为最好的解决方案是比较用户生成的拉链的值,并查看一个ZIP_COUNTY中的所有拉链是否都存在于数组中.

某种迭代器会遍历所有拉链并确保用户的zip包含或不包含zip组中的每个zip.

有任何想法吗?

Mic*_*ohl 76

您可以执行数组差异,如果结果是空数组,则2个数组包含相同的元素:

>> [1,2,3]-[3,1,2] #=> []
Run Code Online (Sandbox Code Playgroud)

如果仍然有元素,那么第一个数组的所有元素都不会出现在第二个元素中:

>> [1,2,5]-[3,1,2] #=> [5]
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案适用于@ Trip的问题中的特定示例,但不适用于一般情况.你需要做两次差分运算:#其中元素的数量不匹配[1] - [1,2]#=> [] [1,2] - [1]#=> [2]#元素内有重复的地方[1,1,2] - [2,2,1]#=> [] [2,2,1] - [1,1,2]#=> [] (15认同)
  • 简单就是蛋糕. (4认同)
  • 先查一下长度! (2认同)

Jes*_*ott 8

下面我正在使用全部?数组上的运算符,如果数组中的所有项都为我传入的块返回true,则返回true.

my_zip = [1,2,3,4,5,6]
[2,3,5].all?{|z| my_zip.include?(z)}
=> true 
[20,3,5].all?{|z| my_zip.include?(z)}
=> false
Run Code Online (Sandbox Code Playgroud)

您只需将其更改为用户的邮政编码即可


car*_*onr 6

> [1,2,3] <=> [1,2,3]
=> 0
> [1,2,3] <=> [2,2,3]
=> -1
> [1,2,3] <=> [3,2,3]
=> -1
> [1,2,3] <=> [1,3,3]
=> -1
> [1,2,3] <=> [1,1,3]
=> 1
Run Code Online (Sandbox Code Playgroud)

这是来自RailsThinker Post,并且一直很适合我.