内置用于检查 vec 是否包含指定元素

Builtin for checking if vec contains specified element

提问人:Lukasz032 提问时间:12/5/2020 更新时间:12/6/2020 访问量:3394

问:

比方说,我有一个包含整数列表,这些整数可能是非连续的(由于元素从数据库中删除)。vec<int>

例:

$occupiedNumbers = vec[1, 2, 3, 5, 6, 8, 10, 11, 12, 13, 15, 16];

现在我需要的是检查它是否包含给定的数字,如果是,请将其增加 1 并重复检查。vec

$newItemNumber = count($occupiedNumbers);
while (/* check if $occupiedNumbers contains $newItemNumber */) {
    $a++;
}

在香草PHP中,有这个,但这对一个有用吗?此外,还有一个内置的,但它旨在与 的前身 .in_array()vecHH\Vector::linearSearch()vecHH\Vector

检查 a 是否包含给定值的正确解决方案是什么?vec

HHVM 和 Hack 文档都没有提到该用例。此外,我缺少某种 REPL 工具,可以在项目外手动检查它,而无需构建整个(可能有故障)的项目。vec

矢量 HHVM hacklang vec

评论

1赞 concat 12/6/2020
HHVM repl 由 调用。这是一个非常全面的 REPL:在命令提示符下键入“?”。hhvm -m debug

答:

4赞 Lucky Brain 12/5/2020 #1

HHVM/HackLang 人员的建议是使用 你可以在这里读到的,但你需要使用 .该库包含大量函数来处理新的数组类型结构:、、。HSL 库中的这些函数以 、 、 为前缀,您会发现 、 等对于其他需求非常有用。C\contains()hhvm/hslcomposervecdictkeysetCVecDictKeysetMathStr

安装该软件包后,它变得可用,但通常添加它更方便以避免长前缀:use namespace

use namespace HH\Lib\C;

这是你如何做到的:

$exists = C\contains($occupiedNumbers, $newItemNumber);

评论

2赞 Lukasz032 12/6/2020
有点失望地看到类型操作的关键函数不是内置的,而是推送到外部库,而遗留函数作为内置函数 - 这有点不一致:)
0赞 Lucky Brain 12/7/2020
我完全同意@Lukasz032,我本来希望能够使用它,但 HackLang 的家伙决定走另一条路。您内置了所有这些方法的 和 类,但他们将它们视为“遗产”,并出于某种原因劝阻它们。$occupiedNumbers->contains($newItemNumber)MapSetVector
1赞 concat 12/7/2020
@LuckyBrain 我同意 HSL 应该被内置,但集合类型不再是对象是有充分理由的(回复:语法)。有关详细信息,请参阅此答案->
0赞 concat 5/8/2021
@Lukasz032 截至本周早些时候,HSL 现已内置于 Hack!
1赞 concat 12/6/2020 #2

如果您真的在寻找从此开始的最长连续间隔,那么在排序列表中找到其初始索引(如果存在)可能会快得多,然后从那里使用直接索引: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>