Solidity
使用 Solidity 比較 2 個不同數組中的項目的最有效方法是什麼?
在 Solidity 智能合約中,我有 2 個需要比較的數組。我希望輸出是 3 個不同的數組,可用於契約中的其他邏輯。
數組範例:
contract myLists { string[5] public listOne = ['AAA','BBB','CCC','DDD','EEE']; string[5] public listTwo = ['AAA','BBB','DDD','FFF','GGG']; }
輸出應該是:
#Output 1: items in listTwo that do not exist in listOne string[] public output1['FFF','GGG'] #Output 2: items in listTwo that exist in listOne string[] public output2['AAA','BBB','DDD'] #Output 3: items in listOne that do not exist in listTwo string[] public output3['CCC','EEE']
從我所有的研究來看,Solidity 中的數組功能似乎非常有限,唯一的方法可能是 for 循環。
使用陣列實現這一目標的最省氣的方法是什麼。或者,是否有更有效的方法使用不同的儲存方法,例如結構?
謝謝。
我可能在這裡犯了一些小錯誤,但你明白了。使用 keccak256(abi.encodePacked(“ABC”)) 能夠比較字元串。然後一次循環遍歷list2的一個元素並將其與list1中的所有元素進行比較,當它看到一個相同的元素時,它將其添加到新列表中,跳出內部循環並進入下一個元素在 list2 中並將其與 list1 中的所有元素進行比較……等等。
//Output: items in listTwo that exist in listOne function compare() public view returns(string[] memory) { // write to memory to save gas when looping through string[5] memory list1 = listOne; string[5] memory list2 = listTwo; string[] memory l2Inl1; uint nonce; for(uint i; i < 5; i++){ for(uint j; j < 5; j++){ if(keccak256(abi.encodePacked(list2[i])) == keccak256(abi.encodePacked(list1[j]))){ l2Inl1[nonce] = list2[i]; nonce++; break } } } return l2Inl1; }
您需要為您需要的每個輸出建構類似的東西。根據您執行的鏈,在每個字元串上執行 keccak256(abi.encodePacked()) 的氣體成本可能會變得昂貴。我會考慮在鏈下做這個。或者首先將字元串轉換為(或從一開始就使用)字節列表,您可以對其進行比較。但是,將它們轉換回來可能會返回意外結果,這完全取決於您的案例,我不知道。但這至少應該能給你一些想法!