Ruby ile min / maks nasıl bulunur


415

Kullanmak istiyorum min(5,10), veya Math.max(4,7). Ruby'de bu etkinin işlevleri var mı?

Yanıtlar:


722

Yapabilirsin

[5, 10].min

veya

[4, 7].max

Numaralandırılabilir modülünden geliyorlar , bu nedenle içeren Enumerableher şey bu yöntemlere sahip olacak.

v2.4 , numarayı atladıkları için Enumerable'ın yöntemlerinden çok daha hızlı olanı Array#minve bunları tanıtır .Array#max#each

@nicholasklick başka bir seçenekten bahseder Enumerable#minmax, ancak bu sefer bir dizi döndürür [min, max].

[4, 5, 7, 10].minmax
=> [4, 10]

3
@kaz Yorumunuzu anladığımdan emin değilim.
Ziggy

3
@Kaz ... std::max(4, 7)daha fazla noktalama işareti olduğunu [4, 7].maxbiliyor musunuz?
tckmn

3
@Doorknob Bunun std::max, ad alanınıza alınabileceğini fark edersiniz , böylece olur max(4, 7). Bekle; yukarıya baktığımda bunu zaten söyledim.
Kaz

18
Noktalama işaretleri burada sorun değil. En fazla birkaç değerin elde edilmesi için tüm yığın tahsisi, burada yatan çirkinliktir.
kdbanman

7
Ruby esas olarak bilgisayar için değil programcı içindir. Matz'un "Dünyadaki her programcının üretken olmasına, programlamanın keyfini çıkarmasına ve mutlu olmasına yardımcı olmasını umuyorum. Ruby dilinin temel amacı budur." Bu Ruby'deki Wikipedia sayfasından.
aaron-kodlama

52

Kullanabilirsiniz

[5,10].min 

veya

[4,7].max

Diziler için bir yöntem.


20
Teknik olarak, Diziler için değil, Numaralandırıcılar için bir yöntemdir.
meagar

1
V2.4'ten beri Enumerable'dan üstün performans gösteren Diziler için bir yöntemdir
Andre Figueiredo

25

Tüm bu sonuçlar ikiden fazla argümanı ele alma gayreti ile çöp üretir. Ben iyi 'ol kıyasla nasıl performans görmek merak ediyorum:

def max (a,b)
  a>b ? a : b
end

bu arada, bu soruya vereceğim resmi cevap.


Ruby 2.4'ün optimize ettiği bazı karışıklıklar var [a,b].max, ancak yukarıdaki uygulamadan daha hızlı olup olmadığı hala net değil. blog.bigbinary.com/2016/11/17/…
Dave Morse

2
Bu mikro-optimizasyon, her ikisi de çok hızlı, fark ihmal edilebilir, karşılaştırmaya bakın: repl.it/@AndreFigueiredo/DearWeirdSweepsoftware
Andre Figueiredo

1
Bu profil oluşturma GC'de geçirilen zamanı dikkate alıyor mu?
Dave Morse

20

Bir karma değerinin maksimum / dakikasını bulmanız gerekirse, #max_byveya#min_by

people = {'joe' => 21, 'bill' => 35, 'sally' => 24}

people.min_by { |name, age| age } #=> ["joe", 21]
people.max_by { |name, age| age } #=> ["bill", 35]

20

Sağlanan yanıtlara ek olarak, Enumerable # max öğesini , diğer bazı programlama dillerinde olduğu gibi, değişken bir sayı veya bağımsız değişken çağırabilecek bir max yöntemine dönüştürmek istiyorsanız , şunları yazabilirsiniz:

def max(*values)
 values.max
end

Çıktı:

max(7, 1234, 9, -78, 156)
=> 1234

Bu, sağlanan tüm bağımsız değişkenleri içeren bir dizi nesnesi veya hiçbir bağımsız değişken sağlanmamışsa boş bir dizi nesnesi oluşturmak için splat operatörünün özelliklerini kötüye kullanır. İkinci durumda, boş bir dizi nesnesindeki Enumerable # maxnil çağrılması döndüğünden yöntem geri döner .nil

Bu yöntemi Math modülünde tanımlamak istiyorsanız, bunun yapılması gerekir:

module Math
 def self.max(*values)
  values.max
 end
end

Enumerable.max değerinin üçlü operatöre ( ?:) kıyasla en az iki kat daha yavaş olduğuna dikkat edin . Daha basit ve daha hızlı bir yöntem için Dave Morse'nin cevabına bakın .


Ancak standart sınıfları ve modülleri yeniden açmak kötü bir uygulama olarak görülmüyor mu?
radiantshaw

-2
def find_largest_num(nums)
  nums.sort[-1]
end

maksimum / minimum bulmak için sıralama israftır; min / max bulma O (n) iken, sıralama O (n log (n)) olur.
Itamar Mushkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.