2011-12-03 105 views

Trả lời

574
array = array.uniq 

uniq method xóa tất cả các phần tử trùng lặp và giữ lại tất cả các phần tử duy nhất trong mảng.

Một trong nhiều nét đẹp của ngôn ngữ Ruby.

+73

Hoặc trong trường hợp này chỉ là '' array.uniq mà làm việc tại chỗ!. – cvshepherd

+38

không, uniq! phương thức sẽ trả về nil nếu mảng đã là duy nhất chưa Ví dụ: a = [1,2,3,4] a.uniq -> [1,2,3,4] nhưng a.uniq! -> nil – duykhoa

+12

Tôi sẽ không thực sự thấy điều này như một vẻ đẹp của ngôn ngữ ruby ​​... nó chỉ là vẻ đẹp của thư viện chuẩn ruby? không hiểu sai, có rất nhiều điều đẹp về ngôn ngữ. –

41

Bạn có thể loại bỏ các yếu tố trùng lặp với các phương pháp uniq:

array.uniq # => [1, 2, 4, 5, 6, 7, 8] 

Điều gì cũng có thể có ích để biết là phương pháp uniq mất một khối, vì vậy ví dụ nếu quý khách có một loạt các phím như thế này :

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"] 

và bạn muốn biết các tập tin độc đáo là những gì, bạn có thể tìm thấy nó ra với:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last } 
+5

Tôi hơi bối rối bởi điều này. Khối được sử dụng nếu bạn cần hàm so sánh của riêng bạn - trong ví dụ của bạn, việc gửi 'uniq' vào mảng đó mà không có khối sẽ trả về cùng giá trị với khối của bạn. – hdgarrood

+0

@hdgarrood có quyền của bạn, tôi không nhận thấy; xem câu trả lời cập nhật của tôi – maprihoda

12

Nếu ai đó đang tìm cách xóa tất cả các phiên bản của các giá trị lặp lại, hãy xem this question.

a = [1, 2, 2, 3] 
counts = Hash.new(0) 
a.each { |v| counts[v] += 1 } 
p counts.select { |v, count| count == 1 }.keys # [1, 3] 
+0

Hoặc có thể chỉ cần làm 'a = [1, 2, 2, 3] a.find_all {| x | a.count (x) == 1} # [1, 3] ' –

71

Bạn cũng có thể trả lại giao lộ.

a = [1,1,2,3] 
a & a 

Thao tác này cũng sẽ xóa các bản sao.

+9

Chức năng, câu trả lời này là chính xác, nhưng tôi nghĩ điều này ít rõ ràng hơn là chỉ sử dụng uniq. –

+16

Tôi đã đặt nó ở đây để bất cứ ai ghé thăm trang này cũng sẽ thấy những cách khác để làm điều đó, tôi đã không cố gắng nói nó tốt hơn theo bất kỳ cách nào. – jaredsmith

+3

Lý do hoạt động này là do khi sử dụng các phép toán đã đặt, mảng kết quả được coi là một tập hợp, là một cấu trúc dữ liệu thường không có giá trị lặp lại. Sử dụng 'a | a' (công đoàn) sẽ làm cùng một thủ thuật. – Cezar

8

Chỉ là một giải pháp thay thế nếu có ai quan tâm.

Bạn cũng có thể sử dụng phương thức to_set của một mảng chuyển đổi mảng thành một tập hợp và theo định nghĩa, các phần tử thiết lập là duy nhất.

[1,2,3,4,5,5,5,6].to_set => [1,2,3,4,5,6] 
0

Đây là một lớp rất chung của vấn đề với nhiều biến thể. Tuy nhiên, tiền đề vẫn như cũ. Mảng đầu vào bao gồm các số nguyên, một số trong đó có thể trùng lặp. Chúng ta phải in tất cả các số duy nhất có trong mảng đó.

Check the complete implementation here

0

Hãy thử với XOR điều hành trong Ruby:

a = [3,2,3,2,3,5,6,7].sort! 

result = a.reject.with_index do |ele,index| 
    res = (a[index+1]^ele) 
    res == 0 
end 

print result 
Các vấn đề liên quan