------------------------------------------------------------------------ -- Need for different collection kinds ------------------------------------------------------------------------ use> ?elNa.authSeq Sequence{'Elmasri','Navathe'} : Sequence(String) use> ?date.copy Set{@dbs42,@dbs43} : Set(Copy) use> ?elNa.authSeq->asOrderedSet() OrderedSet{'Elmasri','Navathe'} : OrderedSet(String) use> ?Set{dbs42,dbs43,dbs52}.numReturns Bag{0,1,1} : Bag(Integer) use> ?Sequence{dbs42,dbs43,dbs52}.numReturns Sequence{0,1,1} : Sequence(Integer) use> ?Set{dbs42,dbs43,dbs52}.numReturns->asSet() Set{0,1} : Set(Integer) ------------------------------------------------------------------------ -- Properties of different collection kinds ------------------------------------------------------------------------ use> ?Set{7,8}=Set{8,7} true : Boolean use> -- Sets: order insensible use> ?Set{7,8}=Set{7,8,7} true : Boolean use> -- Sets: frequency insensible use> ?OrderedSet{7,8}=OrderedSet{8,7} false : Boolean use> -- OrderedSets: order sensible use> ?OrderedSet{7,8}=OrderedSet{7,8,7} true : Boolean use> -- OrderedSets: frequency insensible use> ?Bag{7,8}=Bag{8,7} true : Boolean use> -- Bags: order insensible use> ?Bag{7,8}=Bag{7,8,7} false : Boolean use> -- Bags: frequency sensible use> ?Sequence{7,8}=Sequence{8,7} false : Boolean use> -- Sequences: order sensible use> ?Sequence{7,8}=Sequence{7,8,7} false : Boolean use> -- Sequences: frequency sensible use> ?Tuple{C:Set{7,8}=Set{8,7},D:Set{7,8}=Set{7,8,7}} Tuple{C=true,D=true} : Tuple(C:Boolean,D:Boolean) use> ?Tuple{C:Bag{7,8}=Bag{8,7},D:Bag{7,8}=Bag{7,8,7}} Tuple{C=true,D=false} : Tuple(C:Boolean,D:Boolean) use> ?Tuple{C:Ord{7,8}=Ord{8,7},D:Ord{7,8}=Ord{7,8,7}} Tuple{C=false,D=true} : Tuple(C:Boolean,D:Boolean) use> ?Tuple{C:Seq{7,8}=Seq{8,7},D:Seq{7,8}=Seq{7,8,7}} Tuple{C=false,D=false} : Tuple(C:Boolean,D:Boolean) -- Ord{...}:=OrderedSet{...}, Seq{...}:=Sequence{...} ........................................................................ frequency frequency sensible insensible order sensible Sequence OrderedSet order insensible Bag Set ........................................................................ frequency insensible: - C->includes(E) implies C->including(E) = C - if the collections contains already the element, the additional insertion does not change the collection order insensible: - C->including(E1)->including(E2) = C->including(E2)->including(E1) - the order of insertion does not play any role in the collection ------------------------------------------------------------------------ -- collection operations (part A): select, reject, collect, ... ------------------------------------------------------------------------ use> ?Set{0..31} Set{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31} : Set(Integer) use> ?Set{0..31}->select(i|i.mod(7)=0 and i.mod(9)=0) Set{0} : Set(Integer) use> ?Set{0..31}->select(i|i.mod(7)=0 or i.mod(9)=0) Set{0,7,9,14,18,21,27,28} : Set(Integer) use> ?Set{0..31}->reject(i|i.mod(7)=0 or i.mod(9)=0) Set{1,2,3,4,5,6,8,10,11,12,13,15,16,17,19,20,22,23,24,25,26,29,30, 31} : Set(Integer) use> ?Set{0..7}->collect(i|i) Bag{0,1,2,3,4,5,6,7} : Bag(Integer) use> ?Set{0..7}->collect(i|i*i) Bag{0,1,4,9,16,25,36,49} : Bag(Integer) use> ?Set{0..7}->collect(i|i*i*i) Bag{0,1,8,27,64,125,216,343} : Bag(Integer) use> ?Set{-3,-2,-1}->union(Set{0..3})->collect(i|i*i) Bag{0,1,1,4,4,9,9} : Bag(Integer) use> ?Set{-3,-2,-1}->union(Set{0..3})->collect(i|i*i)->asSet() Set{0,1,4,9} : Set(Integer) use> ?Sequence{-2,-1,0,1,2}->collect(i|i*i) Sequence{4,1,0,1,4} : Sequence(Integer) use> ?OrderedSet{-2,-1,0,1,2}->collect(i|i*i) Sequence{4,1,0,1,4} : Sequence(Integer) use> ?OrderedSet{-2,-1,0,1,2} OrderedSet{-2,-1,0,1,2} : OrderedSet(Integer) use> ?OrderedSet{-2,-1,0,1,2}->collect(i|i*i)->asOrderedSet() OrderedSet{4,1,0} : OrderedSet(Integer) use> ?Set{'X','Z','Y'}->iterate(i;e:Integer=0|e+1) 3 : Integer use> ?Set{'X','Z'}->iterate(i;e:Integer=0|e+1) 2 : Integer use> ?Set{'X','Z','Y','W'}->iterate(i;e:Integer=0|e+1) 4 : Integer use> ?Set{'X','Z','Y','Y'}->iterate(i;e:Integer=0|e+1) 3 : Integer use> ?Set{3.14,2,76,9.99}->iterate(i;e:Integer=0|e+1) 4 : Integer use> ?Set{3.14,2,76,9.99}->iterate(E;RES:Integer=0|RES+1) 4 : Integer use> ?Set{}->including(42) Set{42} : Set(Integer) use> ?Set{} Set{} : Set(OclVoid) ------------------------------------------------------------------------ -- collection operations (part B): iterate, collect, collectNested, ... ------------------------------------------------------------------------ select, collectNested, collect, exists, forall .............................................. ?Set{6,9,8,7,6,8}->iterate(i:Integer;r:Set(Integer)=Set{}| if i.mod(2)=0 then r->including(i) else r endif) ?Set{6,9,8,7,6,8}->select(i|i.mod(2)=0) ........................................................................ ?Set{Sequence{6,7},Sequence{8,9}} ?Set{Sequence{6,7},Sequence{8,9}}->flatten() ........................................................................ ?Set{6,7,8,9}->collectNested(i|Sequence{i,i*i}) ?Set{6,7,8,9}->collect(i|Sequence{i,i*i}) ?Set{6,7,8,9}->collectNested(i|Sequence{i,i*i})->flatten() ?Set{6,7,8,9}->iterate(i:Integer;r:Set(Sequence(Integer))=Set{}| r->including(Sequence{i,i*i})) ?Set{6,7,8,9}->iterate(i:Integer;r:Bag(Integer)=Bag{}| r->including(i)->including(i*i)) ........................................................................ ?Set{6,7,8,9}->iterate(i:Integer;r:Boolean=false | r or i.mod(2)=0) ?Set{6,7,8,9}->exists(i:Integer | i.mod(2)=0) ?Set{6,7,8,9}->iterate(i:Integer;r:Boolean=true | r and i<=9) ?Set{6,7,8,9}->forAll(i:Integer | i<=9) ------------------------------------------------------------------------