2017-05-22 3 views
1

In Ruby, lassen Sie uns sagen, dass ich eine Reihe von ordreed haben, eindeutige NummernWie entferne ich die Anfangselemente meines Arrays nur, wenn das erste Element eine Bedingung erfüllt?

[0, 1, 2, 4, 6, 8, 10] 

Wenn das erste Element des Arrays gleich Null ist, wie entferne ich alle Elemente von teh Anfang des Arrays, die aufeinander folgend sind, mit Null beginnen? Das heißt, in dem obigen Beispiel würde ich will "0", "1" und "2" mich mit

[4, 6, 8, 10] 

verlassen entfernen, aber wenn mein Array

[1, 2, 3, 10, 15] 

ist, würde ich erwarten, Das Array ist unverändert, da das erste Element nicht null ist.

+0

wollen Sie die ersten drei Elemente entfernen, wenn das Array mit 0 beginnt? – Kris

Antwort

2

Klingt so, als würden Sie Entitäten löschen, wenn sie mit ihrer IDX übereinstimmen (vorausgesetzt, die erste IDX ist 0). Versuchen Sie folgendes:

if array.first == 0 
     new_array = array.reject.each_with_index{ |item, idx| item == idx } 
    end 

Obwohl dies nur mit geordneten Anordnungen von eindeutigen Nummern funktionieren, wenn Sie nicht sicher sind, dass sie dann gehören: array = array.sort.uniq

+0

Wahr, aber das ist kein geordneter Array, den OP angegeben hätte. Außerdem habe ich in meiner Bearbeitung angegeben, dass Sie jedes Array mit 'array.sort.uniq' reparieren können –

-1

In Kurzform:

a[0] == 0 ? a[3..-1] : a 

In längerer Form:

if a.first == 0 
    a[3..(a.size)] 
else 
    a 
end 
+1

Nicht nur "drei Elemente". So viele Elemente wie sie aufeinander folgen – Ursus

+0

okay, ich habe die Frage missverstanden. – Kris

2

Sie könnten tun:

x = -1 
while my_array.first == x + 1 do 
    x = my_array.shift 
end 

Beachten Sie, dass Array.shift das gleiche ist wie Array.pop außer dass es vom Anfang des Arrays an funktioniert.

+0

Schön. Es fühlt sich ein bisschen wie FORTRAN an, aber es war die erste richtige Antwort hier. –

0

Wenn ich Sie richtig verstehe, dann kann es sein die möglichen Lösungen:

def foo(array) 
    if array.first.zero? 
    array.keep_if.with_index { |e, ind| e != ind } 
    else 
    array 
    end 
end 

> foo([0, 1, 2, 5, 6, 7]) 
#=> => [5, 6, 7] 
> foo([1, 2, 3]) 
#=> [1, 2, 3] 
4

Sie eine Mischung aus drop_while und with_index nur nutzen könnte, um die ersten passenden Elemente zu entfernen:

[0, 1, 2, 4, 6, 8, 10].drop_while.with_index{|x, i| x == i} 
# [4, 6, 8, 10] 

[1, 1, 2, 4, 6, 8, 10].drop_while.with_index{|x, i| x == i} 
# [1, 1, 2, 4, 6, 8, 10] 

Beachten Sie, dass das zweite und dritte Element im zweiten Beispiel nicht gelöscht werden, obwohl sie ihren Indizes entsprechen.

3

Tropfen Elemente, solange sie ihren Index gleich sind:

a=a.drop_while.with_index{|e,i| e==i} 
Verwandte Themen