Làm thế nào để kiểm tra nếu phần tử trong mảng Groovy / hash / sưu tập / danh sách?


127

Làm thế nào để tôi tìm ra nếu một mảng có chứa một phần tử? Tôi nghĩ rằng có thể có một cái gì [1, 2, 3].includes(1)đó sẽ đánh giá như true.


Bạn có thể tìm thấy chỉ mục trong đó phần tử bằng nhau này nằm trong danh sách không?
Atharva Johri

2
@AtharvaJohriassert [12,42,33].indexOf(42) == 1
Riggs

Câu trả lời:


138

.contains () là phương thức tốt nhất cho danh sách, nhưng đối với bản đồ, bạn sẽ cần sử dụng .containsKey () hoặc .containsValue ()

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')

Và, ngoài ra, để kiểm tra xem bản đồ có chứa một số giá trị không null dưới một khóa nhất định hay không, việc kiểm tra biểu thức sau đây là đủ if(aMap["aKey"]==aValue).
Naeel Maqsudov

245

Một số cú pháp đường

1 in [1,2,3]

32
Cẩn thận. def m = [a: true]; 'a' in m→ đúng chưa def m = [a: false]; 'a' in m→ sai!
Jesse Glick

55

Đối với danh sách, sử dụng contains:

[1,2,3].contains(1) == true

16
Có lẽ bạn muốn nói [1,2,3] .contains (1). Bởi vì tôi đoán chứa hàm chính nó đã trả về một boolean. Tại sao bạn lại muốn so sánh nó với một mã hóa 'đúng'.
Harshay Buradkar

6
@HarshayBuradkar Để thực sự chắc chắn true == true, tất nhiên #joke
Automatico

8

Nếu bạn thực sự muốn phương thức bao gồm của bạn trên một ArrayList, chỉ cần thêm nó:

ArrayList.metaClass.includes = { i -> i in delegate }

3

Gotcha quan trọng để sử dụng .contains () trên Bộ sưu tập các đối tượng, chẳng hạn như tên miền. Nếu khai báo Miền chứa một EqualsAndHashCode hoặc một số triển khai Equals () khác để xác định xem các Ojbects đó có bằng nhau không, và bạn đã đặt nó như thế này ...

import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode(includes = "settingNameId, value")

sau đó .contains (myObjectToCompareTo) sẽ đánh giá dữ liệu trong myObjectToCompareTo với dữ liệu cho từng đối tượng Object trong Bộ sưu tập. Vì vậy, nếu phương thức bằng của bạn không phải là để hít, như của tôi thì không, bạn có thể thấy kết quả không mong muốn.


2
def fruitBag = ["orange","banana","coconut"]
def fruit = fruitBag.collect{item -> item.contains('n')}

Tôi đã làm nó như thế này để nó hoạt động nếu ai đó đang tìm kiếm nó.



0

Bạn cũng có thể sử dụng kết quả khớp với biểu thức chính quy như thế này:

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.