2013-07-04 12 views
26

Tôi có một bộ sưu tập các danh sách ID để được lưu vào cơ sở dữ liệuLàm thế nào để loại bỏ giá trị trùng lặp từ một danh sách trong groovy

if(!session.ids) 
session.ids = [] 

session.ids.add(params.id) 

và tôi phát hiện ra danh sách đó có bản sao, như

[1, 2, 4, 9, 7, 10, 8, 6, 6, 5] 

Sau đó, tôi muốn xóa tất cả các mục trùng lặp bằng cách áp dụng một cái gì đó như:

session.ids.removeAll{ //some clousure case } 

Tôi chỉ tìm thấy điều này:

http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html

Trả lời

47

Tôi không phải là một người Groovy, nhưng tôi tin rằng bạn có thể làm một cái gì đó như thế này:

[1, 2, 4, 9, 7, 10, 8, 6, 6, 5].unique { a, b -> a <=> b } 

Bạn đã thử session.ids.unique()?

+0

nó nói null session.ids là null khi tôi sử dụng nó như session.ids = session.ids.unique() và sau đó tôi đặt nó như session.ids? .unique() và vào cuối phiên ngày. id là trường hợp null.first. – danielad

+0

rằng nhân viên clouser có thể có thêm ý nghĩa nhiều hơn cho hoạt động danh sách của tôi hơn nữa thankyou. – danielad

+0

Có thể chỉ cần sử dụng Bộ thay vì Danh sách – Daniele

26

Làm thế nào về:

session.ids = session.ids.unique(false) 

Cập nhật
Sự khác biệt giữa unique()unique(false): Ai là thứ hai không sửa đổi danh sách ban đầu. Hy vọng rằng sẽ giúp.

def originalList = [1, 2, 4, 9, 7, 10, 8, 6, 6, 5] 

//Mutate the original list 
def newUniqueList = originalList.unique() 
assert newUniqueList == [1, 2, 4, 9, 7, 10, 8, 6, 5] 
assert originalList == [1, 2, 4, 9, 7, 10, 8, 6, 5] 

//Add duplicate items to the original list again 
originalList << 2 << 4 << 10 

// We added 2 to originalList, and they are in newUniqueList too! This is because 
// they are the SAME list (we mutated the originalList, and set newUniqueList to 
// represent the same object. 
assert originalList == newUniqueList 

//Do not mutate the original list 
def secondUniqueList = originalList.unique(false) 
assert secondUniqueList == [1, 2, 4, 9, 7, 10, 8, 6, 5] 
assert originalList  == [1, 2, 4, 9, 7, 10, 8, 6, 5, 2, 4, 10] 
+0

làm việc nhờ mỹ – danielad

+2

@danielad FYI, Nếu bạn không muốn đột biến danh sách ban đầu và tạo ra một danh sách mới mỗi lần sử dụng 'độc đáo (false) '. Danh sách gốc với các mục trùng lặp được giữ nguyên. :) – dmahapatro

+0

@dmahapatro Không thể tin rằng tôi quên rằng .... Tôi thậm chí nghĩ rằng đó là một trong những bổ sung của tôi cho ngôn ngữ ;-) lol –

7
def unique = myList as Set 

Chuyển 'myList' thành Tập hợp. Khi bạn sử dụng các lớp (các lớp tự định nghĩa) phức tạp, hãy chắc chắn rằng bạn đã suy nghĩ về việc triển khai hashCode() và equals() một cách chính xác.

10

Sử dụng độc đáo

def list = ["a", "b", "c", "a", "b", "c"] 
println list.unique() 

này sẽ in

[a, b, c] 
0

Nếu nó được dự định rằng session.ids chứa id duy nhất, sau đó bạn có thể làm:

if(!session.ids) 
    session.ids = [] as Set 

Sau đó, khi bạn làm:

session.ids.add(params.id) 

các từ khóa trùng lặp sẽ không được thêm vào.

Ngoài ra bạn có thể sử dụng cú pháp sau:

session.ids << params.id