/ / Znajdowanie obiektów w haszu o określonym numerze za pomocą Ruby - ruby-on-rails, ruby

Znajdowanie obiektów w haszach o określonym numerze za pomocą Ruby - ruby-on-rails, ruby

Potrzebuję stworzyć metodę, która pobiera Hash i liczbę jako argumenty i zwraca nową tablicę nazw zwierząt domowych według wieku.

my_family_pets_ages = {"Evi" => 6, "Hoobie" => 3, "George" => 12, "Bogart" => 4, "Poly" => 4,
"Annabelle" => 0, "Ditto" => 3}

Mój mam dwa rozwiązania mojego problemu:

def my_hash_finding_method(source, thing_to_find)
source.select {|k,v| v.include? thing_to_find}
end
my_hash_finding_method(my_family_pets_ages, 3)

lub

def my_hash_finding_method(source, thing_to_find)
source.select {|k,v| v.has_value? thing_to_find}
end
my_hash_finding_method(my_family_pets_ages, 3)

Kiedy uruchamiam mój program za pomocą IRB lub wiersza poleceń, otrzymuję:

my_solution.rb:15:in `block in my_hash_finding_method":
undefined method `include?"for 6:Fixnum (NoMethodError)

Dlaczego jest include? niezdefiniowana metoda? Mówi to samo, kiedy używam has_value? Czy mogę używać przestarzałej wersji Ruby? Jestem na 2.0.0?

AKTUALIZACJA: To jest nowe rozwiązanie, które wymyśliłem, wydaje się działać.

def my_hash_finding_method(source, thing_to_find)
num_array = []
source.each do |k,v|
if v == thing_to_find
num_array << k
end
end
print num_array.sort
end

Odpowiedzi:

0 dla odpowiedzi № 1

Będę trochę skromny, ponieważ brzmi to jak zadanie domowe, ale czy wiesz o tym, co k i v oznaczają w tym bloku?

Komunikat o błędzie jest dużą wskazówką. Mówi ci, że próbowałeś wysłać wiadomość do czegoś, co nie jest hasłem, i oczywiście nie ma metod zdefiniowanych dla Hashe. include? na Fixnum.

(Czek Dokumentacja w języku Ruby dla zaznaczenia skrótu wiedzieć, co właściwie tam jest, jeśli chcesz wiedzieć więcej.)

W skrócie: wewnątrz bloku pracujesz ze zmiennymi, których wartość jest ustawiana za pomocą skrótu, nie działa w samym haszowniku. Musisz się na tym sprawdzić.


0 dla odpowiedzi nr 2

Te dwie metody nie istnieją domyślnie, przynajmniej nie dla obiektów, z których korzystasz.

v.include?

zadziała, jeśli v była zmienna, jak hash lub tablica, ale zamiast tego jest to wartość liczbowa, ponieważ jest to wartość dla tego konkretnego klucza i nie ma zdefiniowanej tej metody.

To samo dotyczy v.has_value?. v jest wciąż wartością dla tego konkretnego klucza. select przekazuje klucz i wartość jako oddzielne parametry, jeśli używasz |k,v|. (W sposób Ruby, oni będą dwuelementową tablicą, jeśli użyjesz pojedynczej zmiennej.)

Aby pomóc Ci nauczyć się pomagać sobie, Ruby obejmuje ri polecenie dostępne w wierszu polecenia. Możesz wpisać ri has_value? aby sprawdzić, czy jest to zaimplementowane przez dowolne klasy Ri. Wśród innych wyników jest:

=== Implementacja zHaszysz -------------------------------------------------- ---------------------------- hsh.has_value? (value) -> true lub false  -------------------------------------------------- ----------------------------  Zwraca wartość true, jeśli podana wartość występuje w przypadku niektórych kluczy w hsh.  h = {"a" => 100, "b" => 200} h.has_value? (100) # => prawda h.has_value? (999) # => false

W tym samym kierunku, dla include?:

=== Implementacja zHaszysz -------------------------------------------------- ---------------------------- hsh.include? (key) -> true lub false  -------------------------------------------------- ----------------------------  Zwraca wartość true, jeśli podany klucz występuje w hsh.  h = {"a" => 100, "b" => 200} h.has_key? ("a") # => prawda h.has_key? ("z") # => false

W obu przypadkach numeric nie ma tych metod, z których pochodzi błąd.


Czy coś na wzór tej pracy?

  def my_hash_finding_method(source, thing_to_find)
source.select {|k,v|
if v == thing_to_find then return source[k] end
}
end

To blisko, ale return nie ma tam miejsca i da tylko jedną wartość, nawet jeśli istnieje wiele wartości.

MY_FAMILY_PETS_AGES = {
"Evi"       => 6,
"Hoobie"    => 3,
"George"    => 12,
"Bogart"    => 4,
"Poly"      => 4,
"Annabelle" => 0,
"Ditto"     => 3
}

def my_hash_finding_method(source, thing_to_find)
source.select{ |k, v| v == thing_to_find }
end

my_hash_finding_method(MY_FAMILY_PETS_AGES, 3) # => {"Hoobie"=>3, "Ditto"=>3}

Jeśli chcesz otrzymywać posortowane wyniki, dlaczego? select w obecnych Rubinach zwróci hasz i hashenie korzystają z sortowania, ponieważ są to w zasadzie obiekty dostępu losowego, co daje możliwość dostępu do wartości równie szybko, niezależnie od tego, czy hasz jest posortowany, czy nieposortowany.

Jeśli chcesz zwrócić posortowaną tablicę par klucz / wartość, to jest jeden sposób, aby to zrobić:

def my_hash_finding_method(source, thing_to_find)
source.select{ |k, v| v == thing_to_find }.sort_by{ |k, v| k }
end

my_hash_finding_method(MY_FAMILY_PETS_AGES, 3) # => [["Ditto", 3], ["Hoobie", 3]]

Jeśli chcesz tylko imiona zwierząt, zamiast imienia i wieku, chwyć tylko te klucze, które zostały zwrócone select:

def my_hash_finding_method(source, thing_to_find)
source.select{ |k, v| v == thing_to_find }.keys.sort
end

my_hash_finding_method(MY_FAMILY_PETS_AGES, 3) # => ["Ditto", "Hoobie"]

Zauważ, że w rozwiązaniu zwracanie skrótu z select Używam sort_byi zwykły sort w ostatnim. sort jest w porządku dla wartości takich jak cyfry iznaki / ciągi, które już mają ustaloną kolejność, ale są nieefektywne podczas sortowania za pomocą bloku, aby uzyskać dostęp do atrybutów wewnątrz przekazywanej wartości, ponieważ muszą wykonać wiele nadmiarowych obliczeń, aby określić sposób porządkowania przychodzących wartości. sort_by jest interesującym algorytmem znanym powszechnie jako Transformacja Schwartzian, która oblicza sortowaną wartość razwpis, zapamiętuje go, sortuje według tej wartości, a następnie wypluwa powiązane elementy w odpowiedniej kolejności. Skutkuje to bardzo wydajnym sortowaniem, które może znacznie przewyższyć zwykły sort, jeśli sortowana wartość nie jest łatwo dostępna.

Przeprowadziłem testy porównawcze różnic i jak szybko wykonać sortowanie malejące w "Sortowanie tablicy w porządku malejącym w Ruby", więc spędź trochę czasu przeglądając wybraną odpowiedź na to pytanie.


0 dla odpowiedzi № 3

Czy próbujesz grupować według wartości mieszania?

Więc spróbuj:

pets.group_by{|k,v| v}

Jeśli próbujesz zwrócić tylko tablicę elementów o wartości:

pets.map { |k, v| v == value }