提问人:Lukasz032 提问时间:12/5/2020 更新时间:12/6/2020 访问量:3394
内置用于检查 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];
现在我需要的是检查它是否包含给定的数字,如果是,请将其增加 1 并重复检查。vec
$newItemNumber = count($occupiedNumbers);
while (/* check if $occupiedNumbers contains $newItemNumber */) {
$a++;
}
在香草PHP中,有这个,但这对一个有用吗?此外,还有一个内置的,但它旨在与 的前身 .in_array()
vec
HH\Vector::linearSearch()
vec
HH\Vector
检查 a 是否包含给定值的正确解决方案是什么?vec
HHVM 和 Hack 文档都没有提到该用例。此外,我缺少某种 REPL 工具,可以在项目外手动检查它,而无需构建整个(可能有故障)的项目。vec
答:
4赞
Lucky Brain
12/5/2020
#1
HHVM/HackLang 人员的建议是使用 你可以在这里读到的,但你需要使用 .该库包含大量函数来处理新的数组类型结构:、、。HSL 库中的这些函数以 、 、 为前缀,您会发现 、 等对于其他需求非常有用。C\contains()
hhvm/hsl
composer
vec
dict
keyset
C
Vec
Dict
Keyset
Math
Str
安装该软件包后,它变得可用,但通常添加它更方便以避免长前缀: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)
Map
Set
Vector
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>
评论
hhvm -m debug