struct Multiset(T)

Overview

Multiset implements a collection of unordered elements with duplicates. Also known as Bag.

Multiset uses Hash as storage.

Examples

ms1 = Multiset.new [1, 2]
ms2 = Multiset{2, 1}
ms1 == ms2          # => true
ms1.add(2)          # => Multiset{1, 2, 2}
ms1.merge([2, 6])   # => Multiset{1, 2, 2, 2, 6}
ms1.multiplicity(2) # => 3
ms1.subset? ms2     # => false
ms2.subset? ms1     # => true

Included Modules

Defined in:

multiset.cr

Constant Summary

VERSION = "0.2.0"

Constructors

Instance Method Summary

Constructor Detail

def self.new(enumerable : Enumerable(T)) #

returns a new multiset with elements from the given Enumerable

Example

Multiset.new([1, 2, 3, 1]) # => Multiset{1, 1, 2, 3}

[View source]
def self.new(initial_capacity = nil) #

creates a new empty multiset

if initial_capacity is given, it will determine the initial capacity of the Hash used internally

Example

ms = Multiset(Int32).new
ms.empty # => true

[View source]

Instance Method Detail

def &(other : Multiset) #

returns a new multiset built by performing multiset intersection with the given Enumerable

For each element, new multiplicity is minimum multiplicity in either multiset

Example

ms1 = Multiset{1, 1, 1, 2, 2, 3, 4, 5}
ms2 = Multiset{1, 1, 3, 3, 6}
ms3 = Multiset{'a', 1, 1}

ms1 & ms2 # => Multiset{1, 1, 3}
ms1 & ms3 # => Multiset{1, 1}

[View source]
def &(other : Enumerable) #

[View source]
def *(sf) #

scales the multiplicity of all elements and returns self

Multiset{1, 2, 2} * 2 # => Multiset{1, 1, 2, 2, 2, 2}

[View source]
def +(other) #

adds all objects in the given Enumerable to a copy of self

Example

Multiset{1, 2, 3} + Multiset{3, 4, 5} # => Multiset{1, 2, 3, 3, 4, 5}
Multiset{1, 2, 3} + [3, 4, 5]         # => Multiset{1, 2, 3, 3, 4, 5}

[View source]
def -(other : Enumerable) #

returns a new multiset with all elements in given Enumerable removed

Example

Multiset{1, 2, 3} - [1, 3] # => Multiset{2}

[View source]
def <<(object : T) #

increments multiplicity of the given Object and returns self

Example

ms = Multiset{1, 2, 3}
ms << 4 # => Multiset{1, 2, 3, 4}

[View source]
def ==(other : Multiset) #

returns true if both multisets contain the same elements


[View source]
def ==(other : Set) #

returns true if both sets contain the same elements


[View source]
def ^(other : Enumerable) #

returns a new multiset built by performing symmetric difference with the given Enumerable

For each element, new multiplicity is absolute difference between multiplicity in either multiset.

Example

ms1 = Multiset{1, 1, 1, 2, 2, 3, 4, 5}
ms2 = Multiset{1, 1, 3, 3, 6}
ms3 = Multiset{'a', 1, 1}

ms1 ^ ms2 # => Multiset{1, 2, 2, 3, 4, 5, 6}
ms1 ^ ms3 # => Multiset{'a', 1, 2, 2, 3, 4, 5}

[View source]
def |(other : Enumerable) #

returns a new multiset built by performing mutiset union with the given Enumerable

For each element, new multiplicity is maximum multiplicity in either multiset.

Example

ms1 = Multiset{1, 1, 1, 2, 2, 3, 4, 5}
ms2 = Multiset{1, 1, 3, 3, 6}
ms3 = Multiset{'a', 1, 1}

ms1 | ms2 # => Multiset{1, 1, 1, 3, 3, 6, 2, 2, 4, 5}
ms1 | ms3 # => Multiset{'a', 1, 1, 1, 2, 2, 3, 4, 5}

[View source]
def add(object : T, count : Int32) #

increments multiplicity of the given Object by count and returns self

Example

Multiset{4, 5}.add(6, 2) # => Multiset{1, 2, 6, 6}

[View source]
def add(object : T) #

increments multiplicity of the given Object and returns self

Example

Multiset{1, 2, 3}.add(4) # => Multiset{1, 2, 3, 4}

[View source]
def clear #

removes all elements and returns self


[View source]
def delete(object, count : Int32) #

decrements multiplicity of the given Object by count and returns self


[View source]
def delete(object) #

decrements multiplicity of the given Object and returns self

Example

Multiset{1, 2, 3}.delete(2) # => Multiset{1, 3}
Multiset{4, 4, 5}.delete(4) # => Multiset{4, 5}

[View source]
def dup #

returns a duplicate of self


[View source]
def each(&) #

calls the given block for each element, yielding the element as a parameter. Returns self


[View source]
def each #

returns an iterator over each element


[View source]
def empty? #

returns true if the multiset has no elements

Example

Multiset(Int32).new.empty? # => true
Multiset{1, 2, 3}.empty?   # => false

[View source]
def includes?(object) #

returns true if given Object is an element in the multiset

Example

Multiset{1, 2, 3}.includes?(3)   # => true
Multiset{1, 2, 3}.includes?(4)   # => false
Multiset{1, 2, 3}.includes?('a') # => false

[View source]
def inspect(io) #

see #to_s


[View source]
def intersects?(other : Multiset) #

returns true if the multiset has any element in common with other


[View source]
def merge(elems : Multiset(T)) #

adds all elements from the given multiset and returns self

Example

ms = Multiset{3, 4, 5}
Multiset{1, 2, 3}.merge(ms) # => Multiset{1, 2, 3, 3, 4, 5}

[View source]
def merge(elems) #

adds #each element and returns self

Example

ary = [3, 4, 5]
Multiset{1, 2, 3}.merge(ary) # => Multiset{1, 2, 3, 3, 4, 5}

[View source]
def multiplicity(object : T) #

returns count of the given Object in the multiset

Example

ms = Multiset{1, 2, 2}
ms.multiplicity(1) # => 1
ms.multiplicity(2) # => 2

[View source]
def multiplicity(object : U) forall U #

returns 0


[View source]
def proper_subset?(other : Multiset) #

returns true if the multiset is a proper subset of given multiset

Example

Mutiset{1, 2}.proper_subset? Multiset{1, 2, 3} # => true
Mutiset{1, 2}.proper_subset? Multiset{1, 1, 2} # => true
Mutiset{1, 2}.proper_subset? Multiset{1, 2}    # => false

[View source]
def proper_superset?(other : Multiset) #

returns true if the multiset is a proper superset of given multiset

Example

Mutiset{1, 2, 3}.proper_superset? Multiset{1, 2} # => true
Mutiset{1, 1, 2}.proper_superset? Multiset{1, 2} # => true
Mutiset{1, 2}.proper_superset? Multiset{1, 2}    # => false

[View source]
def size #

returns the number of elements

Example

Multiset{1, 2, 3}.size       # => 3
Multiset{1, 1, 1, 2, 3}.size # => 5

[View source]
def subset?(other : Multiset) #

returns true if the multiset is a subset of given multiset

Example

Mutiset{1, 2}.subset? Multiset{1, 2, 3} # => true
Mutiset{1, 2}.subset? Multiset{1, 1, 2} # => true
Mutiset{1, 2}.subset? Multiset{1, 2}    # => true

[View source]
def subtract(other : Multiset) #

removes all elements in given Enumerable from multiset and returns self

Example

Multiset{1, 2, 3}.subtract([1, 3]) # => Multiset{2}

[View source]
def subtract(other : Enumerable) #

[View source]
def superset?(other : Multiset) #

returns true if the multiset is a superset of given multiset

Example

Mutiset{1, 2, 3}.superset? Multiset{1, 2} # => true
Mutiset{1, 1, 2}.superset? Multiset{1, 2} # => true
Mutiset{1, 2}.superset? Multiset{1, 2}    # => true

[View source]
def to_s(io) #

returns a String representation of the multiset


[View source]
def uniq #

returns an Array containing unique elements from the multiset


[View source]