从数组

时间:2015-07-29 16:41:56

标签: arrays ruby

我有两个数组,array1array2,如下所示:

array1 = [ obj11, obj21, obj31 ]
array2 = [ obj21, obj22, obj23 ]

两个数组中的对象来自同一个类。我想检查array1是否包含array2中已存在的对象并将其删除。

我们说obj11obj22是平等的。 “相等”,我的意思是他们有相似的属性值。然后,我想从obj11中删除array1,然后在obj21中插入obj31array2

我已经在here中为对象类中的属性定义了相等性:

def ==(other)
  return self.a == other.a && self.b == other.b
end

结果数组为:

array2 = [ obj21, obj22, obj23, obj21, obj31 ]

6 个答案:

答案 0 :(得分:3)

您可以使用Array#|(它进行联合操作)来删除重复项。

array1 = ["dog", "cat", "had"]
array2 = ["big", "fight", "had"]
array1 | array2
# => ["dog", "cat", "had", "big", "fight"]

答案 1 :(得分:2)

从多个数组中删除重复值的快捷方法是使用uniq

array1 = ["dog", "cat", "had"]
array2 = ["big", "fight", "had"]

new_array = (array1 + array2).uniq  # <- ["dog", "cat", "had", "big", "fight"]

uniq从数组中删除重复值。通过将array1array2组合在一起,您可以过滤掉其中两个之间的重复项。

答案 2 :(得分:1)

如果我想从字面上解决你的问题,那么,我会写这样的东西:

array1 = [ :obj11, :obj21, :obj31 ]
array2 = [ :obj21, :obj22, :obj23 ]

new_array = (array1 - array2) + array2
p new_array

(array1 - array2)array1中获取array2中的array2中的元素并添加[:obj11, :obj31, :obj21, :obj22, :obj23] 来获取最终结果

输出

jobid

(注意:为了便于说明,我使用符号作为数组的元素)

答案 3 :(得分:1)

我得到了答案。在下面我从array1中删除了array2中已经存在的内容。这里的平等就像我在问题中定义它一样。因此,检查属性(已在方法中定义==)是否相等。

array1.delete_if{|elem| array2.any?{|e| e == elem}}

然后将array1的其余部分添加到array2中。

array2 << array1

然后我展平了array2。

array2.flatten!

答案 4 :(得分:0)

你可以这样做:

 a2.concat(a1.delete_if { |e| a2.include?(e) })

以下是一个例子:

class MyClass
  attr_reader :a, :b, :c
  def initialize(a, b, c)
    @a, @b, @c = a, b, c
  end
  def ==(other)
    self.a == other.a && self.b == other.b
  end
end

a1 = [MyClass.new('cat', 'bat', 'rat'),
      MyClass.new('dog', 'hog', 'pig'),
      MyClass.new('jay', 'bee', 'fly'),]
  #=> [#<MyClass:0x007fca8407b678 @a="cat", @b="bat", @c="rat">,
  #    #<MyClass:0x007fca8407bee8 @a="dog", @b="hog", @c="pig">,
  #    #<MyClass:0x007fca84073ef0 @a="jay", @b="bee", @c="fly">] 
a2 = [MyClass.new('fly', 'bee', 'bat'),
      MyClass.new('cat', 'bat', 'rat'),
      MyClass.new('dog', 'hog', 'cat'),] 
  #=> [#<MyClass:0x007fca840382d8 @a="fly", @b="bee", @c="bat">,
  #    #<MyClass:0x007fca840381e8 @a="cat", @b="bat", @c="rat">,
  #    #<MyClass:0x007fca840380d0 @a="dog", @b="hog", @c="cat">] 

a2.concat(a1.delete_if { |e| a2.include?(e) })
  #=> [#<MyClass:0x007f96d404ea08 @a="fly", @b="bee", @c="bat">,
  #    #<MyClass:0x007f96d404e8c8 @a="cat", @b="bat", @c="rat">,
  #    #<MyClass:0x007f96d404e710 @a="dog", @b="hog", @c="cat">,
  #    #<MyClass:0x007f96d409d9c8 @a="jay", @b="bee", @c="fly">] 
a1
  #=> [#<MyClass:0x007f96d409d9c8 @a="jay", @b="bee", @c="fly">]  

如果我们改变a1的第一个元素:

 MyClass.new('cat', 'bat', 'rat')

为:

 MyClass.new('cat', 'rat', 'bat')

我们获得:

a2.concat(a1.delete_if { |e| a2.include?(e) })
  #=> [#<MyClass:0x007f89528568c0 @a="fly", @b="bee", @c="bat">,
  #    #<MyClass:0x007f8952856708 @a="cat", @b="bat", @c="rat">,
  #    #<MyClass:0x007f89528562d0 @a="dog", @b="hog", @c="cat">,
  #    #<MyClass:0x007f89519277f0 @a="cat", @b="rat", @c="bat">,
  #    #<MyClass:0x007f8951927598 @a="jay", @b="bee", @c="fly">] 

答案 5 :(得分:0)

另一种方式(使用intersection操作):

   array1 = [ 1, 2, 3, 4, 5 ]
   array2 = [ 2, 3, 4, 5, 6 ]
   final_array = array1 + array2
   final_array & final_array

这也将删除重复项。 IRB输出:

2.2.1 :012 > array1 = [ 1, 2, 3, 4, 5 ]
 => [1, 2, 3, 4, 5] 
2.2.1 :013 > array2 = [ 2, 3, 4, 5, 6 ]
 => [2, 3, 4, 5, 6] 
2.2.1 :014 > final_array = array1 + array2
 => [1, 2, 3, 4, 5, 2, 3, 4, 5, 6] 
2.2.1 :015 > final_array & final_array
 => [1, 2, 3, 4, 5, 6]