内置用于检查 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 LibraryC 为前缀, 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>