我需要检查 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)
| 归档时间: |
|
| 查看次数: |
8590 次 |
| 最近记录: |