我试图在数组中展平整数数组,如果数组中的对象不是整数则抛出错误。 以下是我的方法:
def flattenArray(oldArray)
result = []
for i in oldArray do
if i.is_a? Integer
result.push(i)
elsif i.is_a? Array
result += flattenArray(i)
else
print("\nError: '#{i}', is invalid, only flattens arrays with type integer.")
print("\n'#{i}' was not flattened with the array \n")
# This doesn't work the way I expect
return result.clear
break
end
end
return result
end
以下是一些要测试的示例数组:
sample1 = [1,[2,[3]],4]
sample2 = [1,['be',[3]],4]
sample3 = [sample1,[2,[3,4]],[5]]
sample4 = [sample1, [1.5, 3],4, [5,6],7,[[8]]]
flattenArray(sample1) # => [1, 2, 3, 4] (expected)
flattenArray(sample2) # => [1, 3, 4] (expected [])
flattenArray(sample3) # => [1, 2, 3, 4, 2, 3, 4, 5] (expected)
flattenArray(sample4) # => [1, 2, 3, 4, 3, 4, 5, 6, 7, 8] (expected [])
错误打印正常,但是当我尝试在我的else
语句中中断并清除数组时,它实际上不会清除数组,而是保留之前传递的整数错误。我似乎无法弄清楚如何实现这一目标。任何指向正确方向的帮助都将受到赞赏。
答案 0 :(得分:1)
您的return
仅从最里面的递归调用返回。如果要中止处理整个数组,则需要检测结果为空并一直中止:
elsif i.is_a? Array
# this will just append [] if the recursive call aborts
result += flattenArray(i)
else
相反,你想要这样的东西:
elsif i.is_a? Array
subResult = flattenArray(i)
if subResult.empty? then
return result.clear
else
result += subResult
end
当然,如果你想允许空的内部数组,这将是一个问题。使用空数组来表示错误情况在Ruby中是不明确的,也不是非惯用的。最好返回nil
或提出异常。
else
raise ArgumentError, "Noninteger array element"
end
答案 1 :(得分:1)
首先,您的结果无法复制。
由于引发错误时未返回空数组的原因是因为每个递归调用result
不同。例如,对于[1,['be',[3]],4]
,数组['be',[3]]
会导致错误,并为该部分返回一个空数组,但这不会使整个返回值为空数组。返回的整个数组是[1, 4]
(与您声明的不同),['be',[3]]
部分映射为空。