ROR / روبي حذف العناصر لا شيء من مجموعة متداخلة
-
05-07-2019 - |
سؤال
لتقسيم مجموعة إلى قسمين قطع متساوية وأود أن تفعل هذا،
>> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
>> a.in_groups_of( (a.size/2.0).ceil ) if a.size > 0
=> [[1, 2, 3], [4, 5, nil]]
والآن أنا عندي مجموعة المتداخلة التي تحتوي على عناصر معدومة إذا كان حجم المصفوفة هو الغريب. كيف يمكنني إزالة عناصر معدومة من المصفوفات المتداخلة؟ أريد أن أفعل شيئا من هذا القبيل،
a.compact
ولكن للأسف لم يفلح ذلك، روبي يزيل فقط عناصر معدومة على المستوى الأول وليس بشكل متكرر. هل تقدم روبي أي حلول لطيفة لهذه المشكلة؟
المحلول
ومع روبي 1.8.7 وبعد ذلك يمكنك القيام بما يلي:
a.each &:compact!
=> [[1, 2, 3], [4, 5]]
ومع روبي 1.8.6، لديك القيام به هذا الطريق الطويل:
a.each {|s| s.compact!}
وكل من هذه سيتم تعديل محتويات a
. إذا كنت ترغب في إرجاع مجموعة جديدة وترك الأصلي وحدها، يمكنك استخدام collect
بدلا من each
:
# 1.8.7+:
a.collect &:compact
# 1.8.6:
a.collect {|s| s.compact}
نصائح أخرى
إذا كنت لاستخدام in_groups_of
الذي يمكن تمريرها false
كما الوسيطة الثانية، وأنها لن تملأ "الفراغات" مع nil
، ولكن حقا لا شيء.
وإلا إذا كنت تريد تغيير دائم <م> من م>
a.map do |e|
e.compact
end
arr_mixed=['hello', 2222, 'world', nil, [1, 2, 5, 'hi', nil],[1, 2, 3], [4, 5, nil]]
def compact_nested(array)
arr2=[]
array.each { |x|
element = x.class==Array ? x.compact : x
arr2<<element
}
arr2
end
p compact_nested(arr_mixed).compact #=>["hello", 2222, "world", [1, 2, 5, "hi"], [1, 2, 3], [4, 5]]
p arr_mixed #=>["hello", 2222, "world", nil, [1, 2, 5, "hi", nil], [1, 2, 3], [4, 5, nil]]
a.each {|subarray| subarray.compact!}
a.compact!
ويجب أن تعمل ....