Feature #6588

Set#intersect?

Added by Marc-Andre Lafortune almost 2 years ago. Updated 9 months ago.

[ruby-core:45641]
Status:Closed
Priority:Normal
Assignee:Akinori MUSHA
Category:lib
Target version:next minor

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

Associated revisions

Revision 42253
Added by Akinori MUSHA 9 months ago

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. [Feature #6588] Based on the code by marcandre.

History

#1 Updated by Yusuke Endoh almost 2 years ago

  • Status changed from Open to Assigned

#2 Updated by Yutaka HARA over 1 year ago

  • Target version changed from 2.0.0 to next minor

#3 Updated by Marc-Andre Lafortune over 1 year ago

Comment about these simple features would be appreciated.

#4 Updated by Alexey Muranov over 1 year ago

+1. Maybe #meet? instead of #intersect? ? It can be argued that any set intersects any other, just the intersection is sometimes empty :).

#5 Updated by Marc-Andre Lafortune over 1 year 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.

#6 Updated by Akinori MUSHA 9 months ago

OK, accepted. I'll work on it.

#7 Updated by Akinori MUSHA 9 months 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. [Feature #6588] Based on the code by marcandre.

#8 Updated by Akinori MUSHA 9 months 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

Also available in: Atom PDF