سؤال

لتقسيم مجموعة إلى قسمين قطع متساوية وأود أن تفعل هذا،

>> 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!

ويجب أن تعمل ....

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top