内置用于检查 vec 是否包含指定元素
Builtin for checking if vec contains specified element
比方说,我有一个 vec<int>
包含可能不连续的整数列表(由于从数据库中删除了元素)。
示例:
$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];
现在我需要检查这个 vec
是否包含给定的数字,如果是,则将其增加 1 并重复检查。
$newItemNumber = count($occupiedNumbers);
while (/* check if $occupiedNumbers contains $newItemNumber */) {
$a++;
}
在原版 PHP 中有 in_array()
,但是 vec
可以吗?此外,还有一个内置的 HH\Vector::linearSearch()
,但它旨在与 vec
的前身 HH\Vector
.
一起使用
检查vec
是否包含给定值的正确解决方案是什么?
HHVM 和 Hack 文档都没有提到 vec
的用例。另外,我缺少某种 REPL 工具来在项目外手动检查它,而无需构建整个(可能有问题的)项目。
HHVM/HackLang 人的建议是使用 C\contains()
因为你可以阅读 here but you need to install the HSL package (hhvm/hsl
) using composer
. This library contains loads of functions to deal with the new array-type structures: vec
, dict
, keyset
. Those functions in the HSL Library 以 C
为前缀, Vec
, Dict
, Keyset
并且您还会发现 Math
, Str
, 等等,对于其他需求非常有用。
安装该软件包后,它就可用了,但通常添加 use namespace
以避免长前缀更方便:
use namespace HH\Lib\C;
您可以这样做:
$exists = C\contains($occupiedNumbers, $newItemNumber);
如果您真的要寻找从 count($occupiedNumbers)
开始的最长连续间隔,那么在排序列表中找到它的初始索引(如果存在)可能会快得多,然后从那里使用直接索引:
// `use namespace HH\Lib\{C, Vec};` at top level
$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];
$sorted = Vec\sort($occupiedNumbers); // if not sorted in general
$size = count($sorted);
$v = $size;
$i = C\find_key($sorted, $w ==> $w === $v);
if($i !== null) {
for(; $i < $size - 1 && $sorted[$i + 1] === $v + 1; $i++, $v++) {
}
}
// $i is null | <index of largest number in continuous interval>
比方说,我有一个 vec<int>
包含可能不连续的整数列表(由于从数据库中删除了元素)。
示例:
$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];
现在我需要检查这个 vec
是否包含给定的数字,如果是,则将其增加 1 并重复检查。
$newItemNumber = count($occupiedNumbers);
while (/* check if $occupiedNumbers contains $newItemNumber */) {
$a++;
}
在原版 PHP 中有 in_array()
,但是 vec
可以吗?此外,还有一个内置的 HH\Vector::linearSearch()
,但它旨在与 vec
的前身 HH\Vector
.
检查vec
是否包含给定值的正确解决方案是什么?
HHVM 和 Hack 文档都没有提到 vec
的用例。另外,我缺少某种 REPL 工具来在项目外手动检查它,而无需构建整个(可能有问题的)项目。
HHVM/HackLang 人的建议是使用 C\contains()
因为你可以阅读 here but you need to install the HSL package (hhvm/hsl
) using composer
. This library contains loads of functions to deal with the new array-type structures: vec
, dict
, keyset
. Those functions in the HSL Library 以 C
为前缀, Vec
, Dict
, Keyset
并且您还会发现 Math
, Str
, 等等,对于其他需求非常有用。
安装该软件包后,它就可用了,但通常添加 use namespace
以避免长前缀更方便:
use namespace HH\Lib\C;
您可以这样做:
$exists = C\contains($occupiedNumbers, $newItemNumber);
如果您真的要寻找从 count($occupiedNumbers)
开始的最长连续间隔,那么在排序列表中找到它的初始索引(如果存在)可能会快得多,然后从那里使用直接索引:
// `use namespace HH\Lib\{C, Vec};` at top level
$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];
$sorted = Vec\sort($occupiedNumbers); // if not sorted in general
$size = count($sorted);
$v = $size;
$i = C\find_key($sorted, $w ==> $w === $v);
if($i !== null) {
for(; $i < $size - 1 && $sorted[$i + 1] === $v + 1; $i++, $v++) {
}
}
// $i is null | <index of largest number in continuous interval>