2013-07-31 5 views
11

Jak mogę usunąć niektóre elementy z tablicy i wybrać je?Usuń z tablicy i zwróć usunięte elementy w Ruby

Na przykład:

class Foo 
    def initialize 
    @a = [1,2,3,4,5,6,7,8,9] 
    end 

    def get_a 
    return @a 
    end 
end 

foo = Foo.new 
b = foo.get_a.sth{ |e| e < 4 } 
p b # => [1,2,3] 
p foo.get_a # => [4,5,6,7,8,9,10] 

Co mogę użyć zamiast foo.get_a.sth?

+0

Twoja zmienna instancji '@ a' na klasie' Foo' nic nie robi. Powinieneś go usunąć. – sawa

+0

Pytanie jest wyabstrahowane, a szczegóły są usuwane. możesz założyć, że linia '@ a = [1,2,3,4,5,6,7,8,9]' jest wynikiem jakiegoś procesu. – NewMrd

+0

Przepraszam !! Jestem przyzwyczajony do formy java !!! : p – NewMrd

Odpowiedz

22

Jeśli nie trzeba zachować identyfikator obiektu a:

a = [1,2,3,4,5,6,7,8,9,10] 
b, a = a.partition{|e| e < 4} 
b # => [1, 2, 3] 
a # => [4, 5, 6, 7, 8, 9, 10] 

Jeśli trzeba zachować identyfikator obiektu a, a następnie użyć tablicę czasową c:

a = [1,2,3,4,5,6,7,8,9,10] 
b, c = a.partition{|e| e < 4} 
a.replace(c) 
+1

dobra odpowiedź, ale nie mogę zmienić "a". 'a' jest wynikiem funkcji' some_object.get_some_array' – NewMrd

+0

@NewMrd Dlaczego nie możesz tego zmienić? Zmienna jest zmienną, więc zawsze możesz przypisać ją jako wynik tego połączenia, wtedy ten wzór działa dobrze. – tadman

+4

Nie możesz po prostu użyć 'a.select {| e | e <4} "w takim przypadku? Spowoduje to zwrócenie elementów, które pomyślnie przejdą test. –

0
a = [1, 2, 3, 4] 
a.dup - (a.delete_if(&:even?)) 
#=> [2, 4] 

a 
#=> [1, 3] 

a = [1, 2, 3, 4] 
b = a.dup - (a.delete_if { |e| e < 4 }) 
a 
#=> [4] 
b 
#=> [1, 2, 3] 

Edytuj: Wygląda na to, że zaraz po #select ...

a = [1, 2, 3, 4] 
a.select { |e| e < 3 } 
#=> [1, 2] 
+0

Jeśli są zduplikowane elementy, to blok zwróciłby to samo dla nich obu, więc nie jest to coś, co byłoby problemem! –

+0

Czy możesz podać przykład? –

+1

Może się myliłem. Przepraszam. – sawa

1

Gdybyś tylko usunięcie jednego elementu, nie wymaga to powielenie tablicę, itp:

array = [{ id: 1 }, { id: 2 }, {id: 3 }] 
array.delete_at(array.find_index { |element| element[:id] == 1 }) 
#=> {:id=>1} 
+1

Jest to idealne rozwiązanie dla mojej aplikacji o podobnej potrzebie. – Jay

+0

to się nie powiedzie, jeśli find_index zwróci zero – mountriv99

0

ja nadal nie wierzą rubin nie ma czegoś na ten cel w swoich bibliotekach domyślnych. Powinna być odpowiednia metoda #drop. Na pewno jest dostępny klejnot, który dodaje funkcjonalność do klasy tablicowej. Ale kto potrzebuje klejnotów, kiedy można po prostu wyrwać własne skrypty:

#in initializer somewhere 
class Array 
    def exclude(obj) 
    x = self 
    x.delete(obj) 
    x 
    end 
end 

mogę złożyć wniosek przyciągania do projektu github ruby ​​dla tej metody. Ten superman-plaster działa do tej pory bardzo dobrze.