如何检查数组中是否存在一个值?

ara*_*gar 5 solidity

我需要检查 X 数组中的所有值是否都存在于 Y 数组中,执行某些操作。顺序并不重要。

contract test {

    uint[] numbers1;
    uint[] numbers2;

    function push1(uint num1, uint num2, uint num3) public {
        numbers1.push(num1);
        numbers1.push(num2);
        numbers1.push(num3);
    }

    function push2(uint num1, uint num2, uint num3) public {
        numbers2.push(num1);
        numbers2.push(num2);
        numbers2.push(num3);
    }

}
Run Code Online (Sandbox Code Playgroud)

如何检查numbers1中的所有数字是否存在于numbers2中?

Pet*_*jda 11

有两种方法。

您可以创建一个view函数 ( docs ),该函数循环遍历数组并true在找到该项目时返回。请注意,view可以使用无 Gas 的只读调用来调用函数,而不是使用消耗 Gas 费用的(读写)交易

function exists1(uint num) public view returns (bool) {
    for (uint i = 0; i < numbers1.length; i++) {
        if (numbers1[i] == num) {
            return true;
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

这种方法具有线性复杂度。因此,如果您需要在事务期间验证值的存在,则根据数组中项目的总数,其成本可能会很高。

因此,有第二种方法 - 将值复制为mapping( docs ) 的键,可以通过其键直接访问。搜索值的复杂性是恒定的,但存储值的成本却是双倍的。

uint[] numbers1;
mapping(uint => bool) public exists1; // default value for each key is false

function push1(uint num1, uint num2, uint num3) public {
    numbers1.push(num1);
    numbers1.push(num2);
    numbers1.push(num3);

    exists1[num1] = true;
    exists1[num2] = true;
    exists1[num3] = true;
}
Run Code Online (Sandbox Code Playgroud)