如何删除具有特定数量元素的子数组

时间:2017-04-13 12:59:47

标签: arrays ruby

我有一个数组:

arr = [["csb#"], ["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"], ["spl#"]]

如何删除仅包含一个元素的子数组,如["csb#"]

3 个答案:

答案 0 :(得分:3)

只是为了好玩:

arr.reject {|e| e[1..-1].empty? }
=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]

如果您确定阵列在nils 上不包含布尔值,则以下解决方案有效:

arr.map { |f, s, *o| [f, s, *o] if s }.compact

甚至:

arr.map { |e| e if e[1] }.compact

或与select几乎相同(感谢@engineersmnky):

arr.select { |a| a[1] }

答案 1 :(得分:2)

您也可以使用reject。使用!它将改变原始数组,否则将返回一个新数组:

arr =[["csb#"], ["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"], ["spl#"]]
arr.reject {|e| e.length == 1 }
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
arr.reject! {|e| e.length == 1 }
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]
arr
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]

selectselect!也可用于相同的功能:

arr = [["csb#"], ["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"], ["spl#"]]
#=> [["csb#"], ["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"], ["spl#"]]
arr.select! {|e| e.length != 1 }
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]

答案 2 :(得分:1)

使用Array#delete_if方法:

> arr.delete_if{|e| e.size == 1}
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]] 

注意:这将通过删除仅包含1个元素的子数组来修改原始数组。

> arr
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]] 

如果您只想获取包含多个元素的子数组:

Array#select

 > arr.select{|a| a.size  > 1}
 #=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]

或:

Array#reject

> arr.reject{|a| a.size  <= 1}
#=> [["gcp30", "hdd"], ["gcp30", "hdd", "30", "no"]]