如何在Ballerina中求两个数组的交集并创建allrounders数组?
在Ballerina中计算两个Player数组交集的最优方法
要找出同时属于batsmen和bowlers的球员(也就是allrounders),可以根据数组规模选择以下两种最优实现方式:
方法1:filter + exists(适合小规模数组)
这种方式代码简洁直观,直接遍历batsmen数组,检查每个球员的id是否存在于bowlers数组中:
public type Player record { int id; string name; }; Player[] batsmen = [ {id: 1, name: "Virat"}, {id: 2, name: "Rohit"}, {id: 3, name: "Jadeja"} ]; Player[] bowlers = [ {id: 3, name: "Jadeja"}, {id: 4, name: "Bumrah"}, {id: 5, name: "Shami"} ]; Player[] allrounders = batsmen.filter(b => bowlers.exists(bo => bo.id == b.id));
方法2:哈希集合优化(适合大规模数组)
如果数组元素较多,用哈希集合存储bowlers的id可以将查找时间从O(n)降到O(1),整体性能从O(n*m)提升到O(n+m):
public type Player record { int id; string name; }; Player[] batsmen = [ {id: 1, name: "Virat"}, {id: 2, name: "Rohit"}, {id: 3, name: "Jadeja"} ]; Player[] bowlers = [ {id: 3, name: "Jadeja"}, {id: 4, name: "Bumrah"}, {id: 5, name: "Shami"} ]; // 先提取bowlers的id存入哈希集合 hashset<int> bowlerIdSet = new(bowlers.map(bo => bo.id)); // 筛选出id在集合中的batsmen Player[] allrounders = batsmen.filter(b => bowlerIdSet.has(b.id));
注意事项
优先用id作为判断依据,而非直接比较整个Player record:
- id是唯一标识,避免因名字重复导致的错误匹配
- 对比单个int字段比对比整个record的所有字段更高效
内容的提问来源于stack exchange,提问作者LUHEERATHAN THEVAKUMAR
相关产品推荐
相关产品推荐

