【问题标题】:Check if array contains element in D检查数组是否包含 D 中的元素
【发布时间】:2014-06-02 12:01:31
【问题描述】:

对于关联数组我们可以写

if( elem in array) { .. }

我们为一个简单的数组写什么? 我想写验证,例如

enforce(input in [10,20,40]);

【问题讨论】:

  • 对于enforce(input in [10,20,40]);,您也可以使用std.algorithm.among,如下所示:enforce(input.among!(10, 20, 40));

标签: arrays d


【解决方案1】:

in 遗憾地不适用于阵列。您必须使用在std.algorithmhttp://dlang.org/phobos/std_algorithm.html 中定义的canFindsearch。由于您只想知道它是否存在,而不是它在哪里,canFind 是正确的工具。

import std.algorithm: canFind;

if (my_array.canFind(42)) { stuff }

【讨论】:

  • 澄清一下,in 适用于关联数组,而不是 D 中的常规数组,因为它们是如何实现的。关联数组实际上是一个哈希表,这意味着 in 对于 AA 的时间复杂度是 O(1)。对于普通数组,in 的时间复杂度为 O(n),因为它必须遍历数组才能找到您要查找的元素。 D 社区认为,根据容器的不同,使用 O(1) 或 O(n) 的运算符并不是一个好主意,因此 in 只能用于 AA(以及任何用户定义的容器)实施 opIn)。
  • 你说的search不能定义在std.algorithm
【解决方案2】:

除了 canFind 之外,还有 countUntil 可以获取第一次出现的索引。

注意 D 的“in”关键字搜索关联数组的键而不是它的值:

string[string] array = [
    "foo" : "bar"
];

writeln(("foo" in array) != null); // true
writeln(("bar" in array) != null); // false

【讨论】:

    猜你喜欢
    • 2016-10-13
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多