2016-05-25 9 views
1

Ich habe eine find_num Methode, die den Index einer bestimmten Anzahl in einem geordneten Array, z.Ruby finde den Index der nächsten verfügbaren Nummer

find_num(6, [1, 4, 6, 9, 13]) #=> 2 

aber meine spec erfordert auch, dass, wenn die Nummer nicht verfügbar ist es die Position der nächsthöheren Nummer findet so ...

find_num(8, [1, 4, 6, 9, 13]) #=> 3 

als 9 ist die nächste verfügbare Nummer.

Problem haben, diese Umsetzung ... Ich habe gedacht, durch das gesamte Array iterieren aber ich sagte zu berücksichtigen, das Array groß sein könnte ...

+0

Möglicherweise möchten Sie Ihre Implementierung für den ersten Teil zeigen. – Stefan

+0

Ich habe gerade realisiert, dass mein erster Teil durchläuft! Do! –

Antwort

6

Sie einen Block zu index und es passieren kann. ..

[...] gibt den Index des ersten Objekts, für die der Block true zurückgibt. Gibt nil zurück, wenn keine Übereinstimmung gefunden wird.

Beispiele:

[1, 4, 6, 9, 13].index { |n| n >= 6 } #=> 2 
[1, 4, 6, 9, 13].index { |n| n >= 8 } #=> 3 
[1, 4, 6, 9, 13].index { |n| n >= 15 } #=> nil 

Da dies das Array bestellt werden muss, können Sie auch bsearch_index verwenden, die eine binary search ausführt.

+0

Ich denke, er wollte eine Funktion, die beide gleichzeitig tun würde (Vergleich der Gleichheit und wenn keine Gleichheit gefunden wird dann die erste Nummer strikt überlegen bekommen). Ihre Lösung '[1, 4, 6, 9, 8, 13] .index {| n | n> = 8} 'wird 3 zurückgeben, wenn es zurückgeben sollte 4. – Pholochtairze

+0

@Pholochtairze das Array muss bestellt werden, ich habe meine Antwort aktualisiert. Das OP gab jedoch nicht die Art der Bestellung an, "nächstes verfügbares" bedeutet nicht notwendigerweise "nächsthöheres" ... vielleicht ist eine Klärung erforderlich. – Stefan

+1

bearbeitet mein OP, das Array ist immer bestellt ... –

0

Sie können auch einen Index eines beliebigen Elements in Array wie folgt finden.

2.1.8 :040 > [1, 4, 6, 9, 13].index(6) 
=> 2 
    2.1.8 :041 > [1, 4, 6, 9, 13].index(15) 
=> nil 
0
def find_num(n,a) 
    a.each_with_index.to_a.sort_by(&:first).find { |nbr,_| nbr >= n }.last 
end 

find_num(6, [1, 4, 6, 9, 13]) 
    #=> 2 
find_num(8, [1, 4, 6, 9, 13]) #=> 3 
    #=> 3 

Die Schritte zum

n = 8 
a = [1, 4, 6, 9, 13] 

sind wie folgt.

b = a.each_with_index.to_a 
    #=> [[1, 0], [4, 1], [6, 2], [9, 3], [13, 4]] 
c = b.sort_by(&:first) 
    #=> [[1, 0], [4, 1], [6, 2], [9, 3], [13, 4]] 
d = c.find { |nbr,_| nbr >= n } 
    #=> [9, 3] 
d.last 
    #=> 3 
Verwandte Themen