Feature #6588
closedSet#intersect?
Description
There is Set#superset?
, Set#subset?
with their proper
variants, but there is no Set#intersect?
nor Set#disjoint?
To check if two sets intersect, one can do
set.intersection(other).empty?
This cycles through all elements, though. To be efficient, one can instead do the iteration manually:
other.any? { |x| set.include?(x) }
I think it would be natural to add Set#intersect?
and its reverse Set#disjoint?
class Set
def intersect?(enum)
enum.any? { |x| include?(x) }
end
end
Maybe it would be worth it to optimize it if enum is a larger Set by starting it with
return any? { |x| enum.include?(x) } if enum.is_a?(Set) && enum.size > size
Updated by mame (Yusuke Endoh) over 12 years ago
- Status changed from Open to Assigned
Updated by yhara (Yutaka HARA) about 12 years ago
- Target version changed from 2.0.0 to 2.6
Updated by marcandre (Marc-Andre Lafortune) about 12 years ago
Comment about these simple features would be appreciated.
Updated by alexeymuranov (Alexey Muranov) about 12 years ago
+1. Maybe #meet?
instead of #intersect?
? It can be argued that any set intersects any other, just the intersection is sometimes empty :).
Updated by marcandre (Marc-Andre Lafortune) about 12 years ago
alexeymuranov (Alexey Muranov) wrote:
+1.
Thanks for the +1
It can be argued that any set intersects any other, just the intersection is sometimes empty :).
No, I believe it would be wrong to argue that. From wikipedia: "We say that A intersects B if A intersects B at some element"
Moreover: "We say that A and B are disjoint if A does not intersect B. In plain language, they have no elements in common"
I believe that both intersect?
and disjoint?
are the established terms for the concept I'm proposing.
Updated by knu (Akinori MUSHA) over 11 years ago
OK, accepted. I'll work on it.
Updated by knu (Akinori MUSHA) over 11 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r42253.
Marc-Andre, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
Add Set#intersect? and #disjoint?.
- lib/set.rb (Set#intersect?, Set#disjoint?): Add new methods for
testing if two sets have any element in common.
[ruby-core:45641] [Feature #6588] Based on the code by marcandre.
Updated by knu (Akinori MUSHA) over 11 years ago
I followed superset?() and the like, and made the new methods accept only a set for the moment, because I couldn't come up with an idea of how to deal with Range. For example:
- if Set[2].intersect?(1.5..2.5) should return true
- if Set[2].intersect?(3..(1.0/0)) should immediately return false using some knowledge on Range