我需要确保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
答案 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]]