Ruby嵌套each块中部分数组元素意外为nil的解决方法
解决数组两两配对时出现nil的问题
你的代码里出现nil的核心问题是把数组元素当成了索引来用:
在each循环里,n和x是数组里的具体元素值(比如3、4、-7这些),但你却写了arr[n]和arr[x]——这相当于用元素值作为索引去数组里取值。当元素值是负数(比如-7)或者大于等于数组长度(你的数组长度是6,元素6对应的arr[6]就超出范围),Ruby会返回nil,这就是输出里出现空值的原因。
另外,用arr.index(n) == arr.index(x)判断是否是同一个元素也有隐患:如果数组里有重复元素,index只会返回第一个匹配项的索引,导致两个不同位置的相同元素被误判为同一个,不会配对。
方案1:直接使用循环变量(元素值)
既然n和x已经是数组元素,直接打印它们就行,不用再通过索引取一次:
def remove_sum_of_zero(arr) arr.each do |n| arr.each do |x| unless arr.index(n) == arr.index(x) puts "#{n} is being checked with #{x}" end end end end numArr = [3, 4, -7, 5, -6, 6] remove_sum_of_zero(numArr)
注意:这个方案还是存在重复元素的判断问题,如果数组有重复值(比如[3,3,4]),两个3会被当成同一个元素,不会配对。
方案2:遍历索引(更严谨)
如果要确保每个位置的元素和其他位置的元素都配对,不管元素是否重复,最好遍历索引:
def remove_sum_of_zero(arr) arr.each_with_index do |n, i| arr.each_with_index do |x, j| unless i == j puts "#{n} is being checked with #{x}" end end end end numArr = [3, 4, -7, 5, -6, 6] remove_sum_of_zero(numArr)
这个方法用索引i和j判断是否是同一个位置,完全避免了重复元素的判断错误,也彻底解决了nil的问题。
内容的提问来源于stack exchange,提问作者poeticider
相关产品推荐
相关产品推荐

