2016-03-26 5 views
0

Ich initialisiere ein Array, das ein doppeltes Element hat, und dann versuche ich, dieses Element durch eine verschachtelte jede Schleife zu finden.Finden Sie das wiederkehrende Element in einem Array mit einer verschachtelten jede Schleife

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 

Jeder hat eine Idee, warum das nicht funktioniert?

+0

Wenn Sie dies nicht speziell mit verschachtelten Schleifen lösen müssen, lesen Sie diesen Thread: http://stackoverflow.com/questions/8921999/ruby-how-to-find-and-return-a-duplicate -Wert-in-Array – bork

Antwort

1

Das Problem wird durch Ändern des Arrays (mit delete) verursacht, während Sie über dieses Array iterieren.

In der ersten Iteration "zeigt" der Iterator auf das erste Element im Array. Da Sie dieses erste Element löschen, wird das zweite Element das erste Element. In der nächsten Iteration zeigt der Iterator auf das zweite Element im Array - dasjenige, das in der ersten Iteration das dritte war. Sie überspringen das zweite Element in der ersten Iteration und gehen nach vorne.

Wie Sie sehen, würden Sie nicht jedes Element überprüfen, sondern nur jedes zweite Element.

Es könnte etwas effizienter sein, zuerst das Array zu sortieren und dann nur die jeweils aufeinander folgende Elemente überprüfen, ob sie gleich sind:

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

Vielen Dank! – gskang

0

Array # alle der identischen Objekte in dem Array löschen löscht, nicht nur der erste.

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

Wissen Sie, wie Sie ein Element in einem Array anhand seiner Indexnummer löschen können? – gskang

+0

Nvm, gefunden it.Um ein Element bei einem bestimmten Index zu löschen: array.delete_at incase jemand fragt sich. – gskang

0

Hier ist eine effiziente Möglichkeit, das erste doppelte Element zu finden.

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

Verfahren Set#add? ihr Argument zu dem Satz hinzuzufügen versucht. Wenn es erfolgreich ist, gibt es das Argument zurück; else (das Set enthält bereits sein Argument) gibt nil zurück. Da Sets unter den Deckeln sind, sind Lookups sehr schnell.