There is an ongoing outage on the primary CPAN mirror. It is possible to work around the issue by using MetaCPAN as a mirror.

PDK::Utils::Set - 区间集合操作工具类

SYNOPSIS

use PDK::Utils::Set;

# 创建区间集合
my $set = PDK::Utils::Set->new(1, 5);
$set->addToSet(10, 20);

# 合并区间
$set->mergeToSet(6, 9);

# 打印集合
$set->dump;

# 交集
my $set2 = PDK::Utils::Set->new(4, 15);
my $inter = $set->interSet($set2);
$inter->dump;

# 比较关系
say $set->compare($set2);   # equal / containButNotEqual / belongButNotEqual / other

DESCRIPTION

该模块提供了一个基于区间的集合类,实现了区间的添加、合并、比较、交集等常用操作。

ATTRIBUTES

mins

整数数组引用,存储区间集合中每个区间的最小值。

maxs

整数数组引用,存储区间集合中每个区间的最大值。

CONSTRUCTOR

new()

无参数构造,创建一个空集合。

new($setObj)

传入同类对象,复制其区间。

new($MIN, $MAX)

传入两个整数,创建一个单区间集合。

new(%args)

传入参数哈希,手动指定 minsmaxs

METHODS

基础操作

length()

返回集合中的区间数量。

min()

返回集合整体的最小值(第一个区间的最小值),若集合为空返回 undef。

max()

返回集合整体的最大值(最后一个区间的最大值),若集合为空返回 undef。

dump()

打印所有区间,格式为 "MIN MAX"。

集合构造与合并

addToSet($MIN, $MAX)

向集合中插入区间(不检查重叠,需保证输入与现有区间不冲突)。

mergeToSet($MIN, $MAX | $setObj)

向集合中合并区间,若重叠或相邻则会自动合并。

集合比较

compare($setObj)

比较两个集合的关系,返回以下字符串之一:

  • equal - 两个集合完全相等

  • containButNotEqual - 当前集合包含对方但不相等

  • belongButNotEqual - 当前集合属于对方但不相等

  • other - 其他关系

isEqual($setObj)

判断集合是否相等。

notEqual($setObj)

判断集合是否不相等。

isContain($setObj)

判断当前集合是否包含另一个集合(包含相等情况)。

isContainButNotEqual($setObj)

判断当前集合是否包含另一个集合但不相等。

isBelong($setObj)

判断当前集合是否属于另一个集合(包含相等情况)。

isBelongButNotEqual($setObj)

判断当前集合是否属于另一个集合但不相等。

集合运算

interSet($setObj)

返回两个集合的交集,结果为新的集合对象。

interRange(\@rangeSet1, \@rangeSet2)

计算两个区间的交集,返回 (MIN, MAX),若无交集则返回空。

ERROR HANDLING

  • 如果 minsmaxs 长度不一致,构造函数会抛出异常。

  • 如果同一索引的最小值大于最大值,构造函数会抛出异常。

  • addToSetmergeToSet 方法只允许传入两个整数参数,否则抛出异常。

  • 比较方法的参数必须是 PDK::Utils::Set 对象,否则抛出异常。

EXAMPLES

use PDK::Utils::Set;

# 创建区间集合
my $set = PDK::Utils::Set->new(1, 5);
$set->addToSet(10, 20);

# 合并区间
$set->mergeToSet(6, 9);

# 打印集合
$set->dump;

# 交集
my $set2 = PDK::Utils::Set->new(4, 15);
my $inter = $set->interSet($set2);
$inter->dump;

# 比较关系
say $set->compare($set2);   # equal / containButNotEqual / belongButNotEqual / other

AUTHOR

WENWU YAN <968828@gmail.com>

LICENSE AND COPYRIGHT

This software is licensed under the same terms as Perl itself.