交错数组范围查询时如何去重统计符合条件的元素个数
问题分析
你现有代码的统计逻辑存在重复计数问题:程序会遍历待搜索数组的每个元素,针对每个元素依次检查所有查询范围,每匹配一个范围就对总计数累加1。当多个范围重叠覆盖同一个元素时,该元素会被统计多次,所以包含第三个覆盖所有元素的范围时,最终结果为9而非你期望的5。
修正方案
调整内层循环逻辑:单个元素只要匹配到任意一个有效范围,就仅计数1次,直接终止当前元素的后续范围校验,进入下一个元素的判断流程。
修改后的完整代码
public static int GetDecimalsCount(decimal[] arrayToSearch, decimal[][] ranges) { if (arrayToSearch is null) { throw new ArgumentNullException(nameof(arrayToSearch)); } if (ranges is null) { throw new ArgumentNullException(nameof(ranges)); } for (int x = 0; x < ranges.Length; x++) { if (ranges[x] is null) { throw new ArgumentNullException(nameof(ranges)); } if ((ranges[x].Length > 0 && ranges[x].Length < 2) || ranges[x].Length > 2) { throw new ArgumentException("范围数组的元素必须为空或者包含两个边界值"); } } int sum = 0; for (int i = 0; i < arrayToSearch.Length; i++) { for (int j = 0; j < ranges.Length; j++) { if (ranges[j].Length == 0) { continue; } if (arrayToSearch[i] >= ranges[j][0] && arrayToSearch[i] <= ranges[j][1]) { sum++; // 匹配到第一个符合的范围后直接跳出内层循环,避免重复计数 break; } } } return sum; }
可选简化写法(基于LINQ)
如果你偏好更简洁的语法,可以保留参数校验部分后,用LINQ实现核心统计逻辑:
return arrayToSearch.Count(num => ranges.Any(r => r.Length != 0 && num >= r[0] && num <= r[1]) );
该写法的逻辑和修改后的循环逻辑完全一致,可读性更高。
内容的提问来源于stack exchange,提问作者Linascts
相关产品推荐
相关产品推荐

