2010-07-13 13 views
43

Bunu yapacak birkaç kod satırı oluşturabilirim ama bunu yapmayı güzel ve temiz bir Rubyesque yönteminin olup olmadığını merak ediyorum. Açık olmadığım takdirde, aradığım şey, [3,3,3,3,3] veya ["rabbits","rabbits","rabbits"] (true) verildiği halde true değerine dönecek ancak [1,2,3,4,5] veya ["rabbits","rabbits","hares"] ile false döndürecek bir dizi yöntemidir.Dizideki tüm öğelerin aynı olup olmadığını nasıl sınayabilirim?

Teşekkür

cevap

54
class Array 
    def same_values? 
    self.uniq.length == 1 
    end 
end 


[1, 1, 1, 1].same_values? 
[1, 2, 3, 4].same_values? 

Buna ne dersiniz? Bununla birlikte boş bir dizi için false döndürür, < = 1 olarak değiştirebilir ve bu durumda doğru döner. İhtiyacınıza bağlı olarak.

+2

Bu oldukça zarif. Ben sadece .uniq.length == 1 kodunu, yaptığınız gibi değil doğrudan kodumda kullanabilirim (sadece bir kez kullanıyorum, böylece DRY'yi koruyorum). Yerleşik bir .same_values ​​varsa güzel olur mu? yöntem. Benim kodumdaki boş dizi durumu hakkında endişelenmenize gerek yok, a) durumumda ortaya çıkmamalı ve b) eğer yanlışsa, geri dönmesini istemedim. Teşekkürler. – brad

+2

'uniq'' hash' ve 'eql'' kullandığını ve' ==' değil, istediğiniz ya da olmayabilir. –

+1

Biri elbette bunu self.flatten.uniq.lenth == 1 –

67

Sen verilen blok koleksiyonundaki tüm unsurları için de geçerlidir döndürür true döndürür Enumerable#all? kullanabilirsiniz.

array.all? {|x| x == array[0]} 

(dizi boşsa, blok böylece array[0] güvenlidir yapıyor, asla denir.)

+0

'(array.any {| x | x = array [0]!}?)'!? Farklı bir değerin ilk meydana gelmesinden sonra tüm unsurlar olsa bile yinelenmez. –

+4

@ Nu-hin Hiçbiri ne olacak? – sepp2k

+0

Evet, kötüyüm, teşekkürler. –

9

En çok tercih edilen, en kısa ve tatlı cevapları severim. Bütün elementler böyle Sayısal veya dize aynı Enumerable sınıfından olsaydı, kimse ben kullanmak için kullanılan

def all_equal?(array) array.max == array.min end 
+0

Slick. Çok kaygan. – brad

+2

Nesnelerin aynı sınıfta olması gerekmiyor, sadece <=> '(uzay gemisi operatörü) 'nü uygulayabilmeleri gerekiyor. –

+0

@AndrewGrimm Uzay gemisi operatörü, nesnelerin farklı türlerde olması durumunda bu kodun başarısız olmasına neden olur. –

1

kullanabilirsiniz: arrnil içerdiğinde

def add_equal?(arr) arr.reduce { |x,y| x == y ? x : nil } end 

O başarısız olabilir.

1

Ben kullanırsınız:

Peki
array = ["rabbits","rabbits","hares", nil, nil] 
array.uniq.compact.length == 1 
İlgili konular