Bagaimana cara mengecek apakah elemen dalam groovy array / hash / collection / list?

127

Bagaimana cara mengetahui jika array berisi elemen? Saya pikir mungkin ada sesuatu seperti [1, 2, 3].includes(1)yang akan dievaluasi sebagai true.

banderson623
sumber
Dapatkah Anda menemukan indeks juga di mana elemen yang sama ini ada dalam daftar?
Atharva Johri
2
@AtharvaJohriassert [12,42,33].indexOf(42) == 1
Riggs

Jawaban:

138

.contains () adalah metode terbaik untuk daftar, tetapi untuk peta Anda harus menggunakan .containsKey () atau .containsValue ()

[a:1,b:2,c:3].containsValue(3)
[a:1,b:2,c:3].containsKey('a')
Shemnon
sumber
Dan, selain itu, untuk memeriksa apakah peta berisi beberapa nilai bukan nol di bawah kunci tertentu, cukup untuk memeriksa ekspresi berikut if(aMap["aKey"]==aValue).
Naeel Maqsudov
245

Gula sintaksis

1 in [1,2,3]
Dahernan
sumber
32
Cermat. def m = [a: true]; 'a' in m→ benar belum def m = [a: false]; 'a' in m→ salah!
Jesse Glick
55

Untuk daftar, gunakan contains:

[1,2,3].contains(1) == true
banderson623
sumber
16
Mungkin Anda ingin mengatakan [1,2,3] .berisi (1). Karena saya menebak mengandung fungsi itu sendiri sudah mengembalikan boolean. Mengapa Anda ingin membandingkannya kembali dengan hardcoded 'true'.
Harshay Buradkar
6
@HarshayBuradkar Untuk memastikan true == true, tentu saja #canda
Automatico
8

Jika Anda benar-benar ingin memasukkan metode Anda pada ArrayList, cukup tambahkan:

ArrayList.metaClass.includes = { i -> i in delegate }
John Flinchbaugh
sumber
3

Gotcha PENTING untuk menggunakan .contains () pada Kumpulan Objek, seperti Domain. Jika deklarasi Domain berisi EqualsAndHashCode, atau implementasi equals lainnya () untuk menentukan apakah Ojbect itu sama, dan Anda telah mengaturnya seperti ini ...

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

maka .contains (myObjectToCompareTo) akan mengevaluasi data di myObjectToCompareTo dengan data untuk setiap instance Object dalam Koleksi. Jadi, jika metode equals Anda tidak cukup, seperti milik saya, Anda mungkin melihat hasil yang tidak terduga.

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

Saya melakukannya seperti ini sehingga berfungsi jika seseorang mencarinya.

HinataXV
sumber
0

Anda juga dapat menggunakan kecocokan dengan ekspresi reguler seperti ini:

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
ninj
sumber