11.7 操作和良构规则

本节包含集合类型的操作和良构规则。

11.7.1 Collection

= (c : Collection(T)) : Boolean

如果c和self是相同种类的集合,并且包含相同数量的元素,而且如果是有序集合类型的话,元素的次序还要一致,结果才是真。

<> (c : Collection(T)) : Boolean

如果c不等同self,则为真。

post: result = not (self = c)

size() : Integer

集合self中元素的个数。

post: result = self->iterate(elem; acc : Integer = 0 | acc + 1)

includes(object : T) : Boolean

如果objectself的一个元素,则为真,否则为假。

post: result = (self->count(object) > 0)

excludes(object : T) : Boolean

如果object不是self的一个元素,则为真,否则为假。

post: result = (self->count(object) = 0)

count(object : T) : Integer

object在集合self中出现的次数。

post: result = self->iterate( elem; acc : Integer = 0 |
        if elem = object then acc + 1 else acc endif)

includesAll(c2 : Collection(T)) : Boolean

判断self是否包含c2的所有元素

post: result = c2->forAll(elem | self->includes(elem))

excludesAll(c2 : Collection(T)) : Boolean

判断self是否不包含c2的任意元素

post: result = c2->forAll(elem | self->excludes(elem))

isEmpty() : Boolean

self是否为空集合

post: result = ( self->size() = 0 )

注意,因为null可以隐式的转换为Bag{},所以null->isEmpty()返回‘true’。

notEmpty() : Boolean

self是否不空

post: result = ( self->size() <> 0 )

因为null可以隐式的转换为Bag{},所以null->isEmpty()返回‘false’。

max() : T

self中所有元素的最大值。元素类型必须支持max操作。元素所支持的max操作必须有一个类型为T的参数且满足结合律和交换律。UnlimitedNatural,Integer和Real都满足这些条件。

post: result = self->iterate( elem; acc : T = self->any(true) | acc.max(elem) )

min() : T

self中所有元素的最小值。元素类型必须支持min操作。元素所支持的min操作必须有一个类型为T的参数且满足结合律和交换律。UnlimitedNatural,Integer和Real都满足这些条件。

post: result = self->iterate( elem; acc : T = self->any(true) | acc.min(elem) )

sum() : T

self中所有元素相加。元素必须是可以支持+操作的类型。+操作有一个类型为T的参数,并且满足结合律和交换律。UnlimitedNatural,Integer和Real都满足这些条件。

post: result = self->iterate( elem; acc : T = 0 | acc + elem )

如果+操作不能既满足结合律有满足交换律,那么求和表达式不是良构的,这将导致在计算过程中结果的不确定性。如果一个实现可以检测到不支持结合律或交换律,那么该实现就可以掠过计算直接返回一个invalid结果。

product(c2: Collection(T2)) : Set( Tuple( first: T, second: T2) )

selfc2的笛卡尔乘积。

post: result = self->iterate (e1; acc: Set(Tuple(first: T, second: T2)) = Set{} |
                c2->iterate (e2; acc2: Set(Tuple(first: T, second: T2)) = acc |
                                acc2->including (Tuple{first = e1, second = e2}) ) )

selectByKind(type : Classifier) : Collection(T)

返回self中所有类型是type或其子类的元素集合。返回集合的元素类型T是给定的type

post: result = self ->collect(if oclIsKindOf(type) then oclAsType(type) else null endif) ->excluding(null)

selectByType(type : Classifier) : Collection(T)

返回self中所有类型是type而非其子类的元素集合。返回集合的元素类型T是给定的type

post: result = self ->collect(if oclIsTypeOf(type) then oclAsType(type) else null endif) ->excluding(null)

asSet() : Set(T)

从self获得一个包含所有元素的Set,重复的去掉。

post: result->forAll(elem | self ->includes(elem))
post: self ->forAll(elem | result->includes(elem))

asOrderedSet() : OrderedSet(T)

从self获得一个包含所有元素的OrderedSet,重复的去掉。元素次序依赖于特定的具体集合类型。

post: result->forAll(elem | self->includes(elem))
post: self ->forAll(elem | result->includes(elem))

asSequence() : Sequence(T)

从self获得一个包含所有元素的Sequence,元素次序依赖于特定的具体集合类型。

post: result->forAll(elem | self->includes(elem))
post: self ->forAll(elem | result->includes(elem))

asBag() : Bag(T)

从self获得一个包含所有元素的Bag。

post: result->forAll(elem | self->includes(elem))
post: self ->forAll(elem | result->includes(elem))

flatten() : Collection(T2)

如果元素类型不是一个集合类型,那么结果是与self相同的集合。如果元素类型是一个集合类型,那么结果是self的所有元素递归展开后的集合。

良构规则:

[1] 集合不能包含invalid值。

context Collection
inv: self->forAll(not oclIsInvalid())

results matching ""

    No results matching ""