remorhaz / int-rangesets
整数范围集合操作
v0.3.0
2024-02-11 17:48 UTC
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
Requires (Dev)
- bamarni/composer-bin-plugin: ^1.8
- phpunit/phpunit: ^10.1 || ^11
README
这个小型库允许操作整数集合。
需求
- PHP 8.1, 8.2, 8.3。
安装
composer require remorhaz/int-rangesets
用法
简介
集合 以连续 范围 的形式表示;每个范围由一对整数表示,表示它的第一个和最后一个值。
范围
范围不能为空,但只能包含一个整数;在这种情况下,它的第一个和最后一个值是相同的。
<?php use Remorhaz\IntRangeSets\Range; // Contains values: 5, 6, 7, 8 $range1 = new Range(5, 8); // Contains value 12 $range2 = new Range(12);
范围是不可变的。对范围的任何操作都会创建一个新的实例,而保留原始实例不变。
<?php use Remorhaz\IntRangeSets\Range; // Contains values: 5, 6, 7, 8 $range1 = new Range(5, 8); // New range has first value replaced and contains values: 7, 8 $range2 = $range1->withStart(7);
范围集合
集合中的所有范围都进行了规范化:它们按升序排列,并由非空间隔分隔,因此没有一个紧接在另一个后面或重叠。
范围集合也是不可变的。对集合的任何操作都会创建一个新的实例,而保留原始实例不变。
<?php use Remorhaz\IntRangeSets\Range; use Remorhaz\IntRangeSets\RangeSet; // Contains single range [3..5] $rangeSet1 = RangeSet::create(new Range(3, 5)); // Added range [4..10] partially overlaps already existing one. // Resulting range set contains single merged range [3..10]. $rangeSet2 = $rangeSet1->withRanges(new Range(4, 10));
范围合并需要资源,因此存在一种快速但不可靠的方式来用范围初始化集合。在这种情况下,构建代码必须完全负责范围的规范化。
<?php use Remorhaz\IntRangeSets\Range; use Remorhaz\IntRangeSets\RangeSet; // Creates range with two ranges: [2..5] and [7..8]. $rangeSet1 = RangeSet::createUnsafe(new Range(2, 5), new Range(7, 8));
警告:对非规范化范围集合的操作将返回不正确的结果!请使用带有任意范围列表的 create()
方法。
可用操作
在所有示例中,$a
、$b
和 $result
是实现 \Remorhaz\IntRangeSets\RangeSetInterface
的对象。
许可证
此库根据 MIT 许可证 许可。