2016-03-26 40 views
0

Yinelenen bir öğeye sahip bir dizi başlatıyorum ve sonra bu çok öğeyi yuvalanmış her döngüde bulmaya çalışıyorum.İç içe geçmiş her bir döngü iç içe geçmiş bir dizideki yinelenen öğeyi bulun

array=(1..100).to_a 
array.insert(5, 100) 

array.each do |x| 
    m = x 
    array.delete(x) 
    array.each do |y| 
    if m == y 
     puts m 
    end 
    end 
end 

Bunun neden çalışmadığına dair bir fikriniz var mı?

+0

İç içe döngüler kullanarak bunu özellikle çözmeniz gerekmiyorsa, bu konuya bakın: http://stackoverflow.com/questions/8921999/ruby-how-to-find-and-return-a-duplicate -value-in-array – bork

cevap

1

Sorun, bu dizi üzerinde yineleme yaparken dizi değiştirerek (delete ile) neden olur.

İlk yinelemede yineleyici, dizideki ilk öğeye "puanlar". Bu ilk elemanı sildiğinizden, ikinci öğe ilk haline gelir. Sonraki yinelemede yineleyici, dizideki ikinci öğeye işaret eder - ilk yinelemede üçüncü olanı. İlk iterasyonda ikinci olan öğeyi atlar ve öne doğru gider.

Gördüğünüz gibi, her elemanı kontrol etmediğinizde, yalnızca her bir ikinci elemanı kontrol ediyorsunuz.

Biraz daha verimli birinci diziyi sıralamak ve bunlar eşitse o zaman sadece her ardışık elemanlarını kontrol olabilir:

array.sort.each_cons(2) { |x, y| puts(x) if x == y } 
+0

Çok teşekkür ederim! – gskang

0

Dizi # sadece, dizideki siler özdeş tüm nesneleri silmek ilki.

ar = [1,2,1] 
ar.delete(1) 
p ar #=> [2] 
+0

Dizideki bir öğeyi dizin numarasına göre nasıl sileceğinizi biliyor musunuz? – gskang

+0

Nvm, bulundu. Belirli bir dizindeki bir öğeyi silmek için: array.delete_at, birinin merak ettiğini varsayalım. – gskang

0

İlk yinelenen öğeyi bulmak için etkili bir yol.

require 'set' 
s = Set.new 
[1,3,2,5,3,4,7].find { |e| !s.add?(e) } 
    #=> 3 

Set#add? yöntemi, bağımsız değişkenini kümeye eklemeyi dener. Başarılı olursa argümanı döndürür; else (set zaten argümanını içerir) nil döndürür. Setler kapakların altındaki karmalar olduğundan, aramalar çok hızlıdır.

İlgili konular