2010-07-13 61 views
43

Tôi có thể tạo ra một vài dòng mã mà sẽ làm điều này nhưng tôi tự hỏi nếu có một cách tốt đẹp sạch Rubyesque làm điều này. Trong trường hợp tôi không rõ ràng, những gì tôi đang tìm kiếm là phương thức mảng sẽ trả về true nếu được cho ([3,3,3,3,3] hoặc ["rabbits","rabbits","rabbits"] nhưng sẽ trả về false bằng [1,2,3,4,5] hoặc ["rabbits","rabbits","hares"].Làm cách nào để kiểm tra xem tất cả các mục trong một mảng có giống hệt nhau không?

Cảm ơn

Trả lời

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


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

gì về việc này không? Nó trả về false cho một mảng trống mặc dù, bạn có thể thay đổi nó thành < = 1 và nó sẽ trả về true trong trường hợp đó. Tùy thuộc vào những gì bạn cần.

+2

Đó là khá thanh lịch. Tôi chỉ có thể sử dụng các .uniq.length == 1 trực tiếp trong mã của tôi chứ không phải là cách bạn đã làm nó (Tôi chỉ sử dụng nó một lần vì vậy tôi giữ nó DRY). Nó sẽ được tốt đẹp nếu có được xây dựng trong .same_values? phương pháp. Tôi không cần phải lo lắng về trường hợp mảng trống trong mã của tôi như a) nó không nên đi lên trong tình hình của tôi và b) nếu nó đã làm tôi sẽ muốn nó trở về sai. Cảm ơn. – brad

+2

Lưu ý rằng 'uniq' sử dụng' hash' và 'eql?' Và không phải '==' có thể hoặc không thể là thứ bạn muốn. –

+1

Tất nhiên, bạn có thể mở rộng chuỗi này lên các mảng lồng nhau với self.flatten.uniq.lenth == 1 –

67

Bạn có thể sử dụng Enumerable#all? mà trả về true nếu khối được trả về đúng cho tất cả các yếu tố trong bộ sưu tập.

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

(Nếu mảng rỗng, khối không bao giờ được gọi là, làm như vậy array[0] là an toàn.)

+0

Làm thế nào về '(array.any {| x | x = array [0]!}?)'? Nó sẽ không lặp đi lặp lại mặc dù tất cả các phần tử sau lần xuất hiện đầu tiên của một giá trị khác. –

+4

@ Nu-hin Cả hai sẽ không? – sepp2k

+0

Vâng, xấu của tôi, cảm ơn bạn. –

9

Tôi cũng thích câu trả lời ưa thích nhất, ngắn và ngọt ngào. Nếu tất cả các yếu tố đến từ lớp Enumerable cùng, chẳng hạn như số hoặc chuỗi, người ta có thể sử dụng

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

Slick. Rất trơn. – brad

+2

Các đối tượng không cần phải ở trong cùng một lớp, chúng chỉ cần có khả năng thực hiện '<=> '(toán tử tàu vũ trụ). –

+0

@AndrewGrimm Nhà điều hành tàu vũ trụ khiến mã này thất bại nếu các đối tượng có nhiều loại khác nhau. –

1

tôi sử dụng để sử dụng:

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

Nó có thể thất bại khi arr chứa nil.

1

Tôi sẽ sử dụng:

array = ["rabbits","rabbits","hares", nil, nil] 
array.uniq.compact.length == 1 
Các vấn đề liên quan