确保数组中的两个字段是唯一的

时间:2015-06-21 15:36:39

标签: ruby-on-rails ruby

我需要确保follower_id和followed_id在一个数组中是唯一的,该数组还包含一个名为value的第三个数字。都是整数。 follower_id和followed_id的组合需要是唯一的,而不是单个数字本身。这就是我所拥有的

Relationship.populate 1..20 do |relationship|
        relationship.follower_id = (1..20)
        relationship.followed_id = (1..20)
        relationship.value = rand(1..5)
        end

这将确保

1,3,5
1,3,5
2,3,5
1,2,5

将是

1,3,5
2,3,5
1,2,5

3 个答案:

答案 0 :(得分:2)

假设不考虑成对的订单,并且你想要消除三元组,即使有不同的value,你也可以去:

a = [[1,3,5], [3,1,5], [2,3,5], [2,3,6], [1,2,5]]
# to count [1,3,5] and [3,1,5] as similar
a.group_by { |(fd,fr,_)| [fd,fr].sort }.values.map &:first
# to count [1,3,5] and [3,1,5] as different
a.group_by { |(fd,fr,_)| [fd,fr] }.values.map &:first
#⇒ [[1,3,5], [3,1,5], [2,3,5], [1,2,5]]

答案 1 :(得分:1)

完美的独特性

这是一个解决方案,假设三元组中的顺序很重要,并且您希望每个三元组都是完全唯一的。只需在uniq类上使用Array方法即可。它的工作原理如下:

[
  [1,3,5], 
  [1,3,5],
  [2,3,5],
  [1,2,5]
].uniq

#=> [[1, 3, 5], [2, 3, 5], [1, 2, 5]]

部分唯一性

如果相反,您只关心前两个是唯一的,请将uniq方法传递给一个块,该块返回您想要唯一的子集。如果您只想要三元组的前两个元素并且可以丢弃重复项,即使第三个元素是唯一的,您也可以将其传递给0..1范围。

[
  [1,3,5], 
  [1,3,5],
  [2,3,5],
  [1,2,5],
  [1,2,6]
].uniq { |triple| triple[0..1] }

#=> [[1, 3, 5], [2, 3, 5], [1, 2, 5]]

请注意,最后一个元素[1,2,6]已被废弃,即使它在6中结束,因为它被视为[1,2,5]的副本。这是因为[1,2,5][0..1] #=> [1,2][1,2,6][0..1] #=> [1,2]

答案 2 :(得分:1)

a = [[1,3,5], [1,3,4], [3,1,2], [2,3,2], [2,3,1], [1,2,3]]

如果a的每个元素的前两个元素的顺序很重要:

a.uniq { |e| e[0,2] }
  #=> [[1, 3, 5], [3, 1, 2], [2, 3, 2], [1, 2, 3]] 

如果a的每个元素的前两个元素的顺序不重要:

require 'set'
a.uniq { |e| Set.new e[0,2] } 
  #=> [[1, 3, 5], [2, 3, 2], [1, 2, 3]]