2009-07-28 6 views
68

Oluşturulan ve atanan iki dizi Görevim var. Tüm atanan görevleri oluşturulan görev dizisinden kaldırmak istiyorum. İşte benim çalışma, ama dağınık, kod:Ruby'de bir diziden bir Dizi çıkarma

@assigned_tasks = @user.assigned_tasks 
    @created_tasks = @user.created_tasks 

    #Do not show created tasks assigned to self 
    @created_not_doing_tasks = Array.new 
    @created_tasks.each do |task| 
     unless @assigned_tasks.include?(task) 
      @created_not_doing_tasks << task 
     end 
    end 

daha iyi bir yolu olmadığına emin değilim. Bu ne? Teşekkür

+0

Başlığın altından bahse girerim, cevap sadece orada kodladığınız şeyi yapıyor. – baash05

cevap

147

:-) Sen Ruby diziler çıkarabilir:

[1,2,3,4,5] - [1,3,4] #=> [2,5] 

ary - other_ary → new_ary Dizi Fark

orijinal dizinin bir kopyası olan yeni dizi döndürür, kaldırma Diğer_yazıda da görünen tüm öğeler. Sipariş, özgün dizisinden korunur.

Öğeleri hash ve eql? verimlilik için yöntemler.

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]

Eğer seti benzeri davranış gerekiyorsa, kütüphane sınıfı Set bakın.

Array belgelerine bakın.

+2

Arg. Benim için büyük yüz hurma anı. Bazı sebeplerden dolayı bu nesnelerle çalışmayacağını düşündüm. Sadece iyi çalışıyor - teşekkürler! – doctororange

+1

np, buna dikkat edin, – hobodave

+25

bununla dikkatli olun, ilk önce IRB'de test edin, örneğin: [5, 5, 5, 5] - [5, 5] = [] ... çıkarma, içindeki benzersiz öğeleri dizi. – hagope

4

yukarıdaki çözüm

a - b 

dizi a gelen dizi b elemanların tüm örneklerini siler. Bazı durumlarda

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ] 

, sonuç [1, 2, 3, 3, 5] olmak istiyorum. Yani, tüm kopyaları silmek istemezsiniz, ancak sadece öğeleri ayrı ayrı.

İki diziler sıralanır değil, kodun bile çalışır

class Array 
    def delete_elements_in(ary) 
    ary.each do |x| 
     if index = index(x) 
     delete_at(index) 
     end 
    end 
end 

testinde

irb(main):198:0> a = [ 1, 1, 2, 2, 3, 3, 4, 5 ] 
=> [1, 1, 2, 2, 3, 3, 4, 5] 
irb(main):199:0> b = [ 1, 2, 4 ] 
=> [1, 2, 4] 
irb(main):200:0> a.delete_elements_in(b) 
=> [1, 2, 4] 
irb(main):201:0> a 
=> [1, 2, 3, 3, 5] 

tarafından bunu başarabilir. Örnekte, diziler sıralanmıştır, ancak bu gerekli değildir.