2009-09-06 20 views
5

Czy istnieje dobry sposób w Ruby do usuwania duplikatów w przeliczalnych listach (czyli odrzucić, etc.)Ruby usuwanie duplikatów w przeliczalnych list

+0

Czy możesz określić, jaki rodzaj listy masz na myśli, że (1) * nie jest * tablicą, ale (2) może mieć duplikaty? Zakresy nie mogą mieć duplikatów. – Telemachus

+0

"Listy przeliczalne" są bardzo niejasne. Czy jest to zmienna instancji klasy Enumerator? – peterpengnz

Odpowiedz

10

Na tablicy można używać Uniq() metoda

a = [ "a", "a", "b", "b", "c" ] 
a.uniq #=> ["a", "b", "c"] 

więc jeśli tylko

(1..10).to_a.uniq 

lub

%w{ant bat cat ant}.to_a.uniq 

bo i tak prawie każdy meto ds wykonałeś polecenie zwróci jako klasa Array.

+1

Należy zauważyć, że '(1..10) .to_a.uniq' nigdy nie może być niczym innym, jak zmarnowanym typowaniem, ponieważ z definicji zakresy nie mogą zawierać duplikatów. (Czy jest tam coś, z czym jestem bardzo zdezorientowany?) – Telemachus

+0

Masz rację, nigdy nie jest duplikatem. po prostu daj pomysł. Dodałem kolejną próbkę, dzięki. – Jirapong

+2

Jest technicznie możliwe, aby zasięg (czegoś innego niż Fixnums) powodował duplikowanie elementów - wszystko, czego wymaga to dla jakiegoś obiektu x, x.succ == x. Na przykład klasa reprezentująca liczby Fibonacciego będzie miała tę właściwość dla liczby 1. Nie jestem pewien, dlaczego to zrobiłeś - najprawdopodobniej jest to oznaką szaleństwa - ale jest * możliwe *. – Chuck

2

Dobrze strategią byłoby je konwertować do tablic i usunąć duplikaty z tablicami . W każdym razie listy są tablicami ruby, więc nie jestem pewien, co masz na myśli przez "listy przeliczalne"

+1

Jestem również zdezorientowany przez "listę przeliczalną". Jeśli jest to tablica, to jest naprawdę łatwe. Jeśli jest to klasa Enumerator, wymaga dużo więcej myślenia. – peterpengnz

1

Lubię używać operatorów logiki zbiorów, jeśli obiekt nie ma metody .uniq.

a = [2,3,3,5,5,5,6] # => [2, 3, 3, 5, 5, 5, 6] 
a | a # => [2, 3, 5, 6] 
Powiązane problemy