Groovy array / hash / collection / list öğesinin olup olmadığı nasıl kontrol edilir?


127

Bir dizinin eleman içerip içermediğini nasıl anlarım? [1, 2, 3].includes(1)Olarak değerlendirilebilecek bir şey olabileceğini düşündüm true.


Bu eşit öğenin listenin neresinde olduğunu da bulabilir misin?
Atharva Johri

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

Yanıtlar:


138

.contains (), listeler için en iyi yöntemdir, ancak haritalar için .containsKey () veya .containsValue () kullanmanız gerekecektir.

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

Ayrıca, bir haritanın belirli bir anahtar altında boş olmayan bir değer içerip içermediğini kontrol etmek için aşağıdaki ifadeyi kontrol etmek yeterlidir if(aMap["aKey"]==aValue).
Naeel Maqsudov

246

Biraz sözdizimi şekeri

1 in [1,2,3]

32
Dikkatli. def m = [a: true]; 'a' in m→ henüz doğru def m = [a: false]; 'a' in m→ yanlış!
Jesse Glick

55

Listeler için şunu kullanın contains:

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

16
Muhtemelen [1,2,3] .contains (1) demek istediniz. Tahmin ediyorum, işlevin kendisi zaten bir boole döndürüyor. Neden tekrar kodlanmış bir 'doğru' ile karşılaştırmak istiyorsunuz?
Harshay Buradkar

6
@HarshayBuradkar Gerçekten emin olmak için true == true, tabii ki # şaka
Automatico

8

İçerme yönteminizi bir ArrayList'de gerçekten istiyorsanız, eklemeniz yeterlidir:

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

3

ÖNEMLİ Etki Alanları gibi Nesnelerin Koleksiyonunda .contains () kullanmak için Gotcha. Domain bildirimi bir EqualsAndHashCode veya bu Ojbect'lerin eşit olup olmadığını belirlemek için başka bir equals () uygulaması içeriyorsa ve bunu şu şekilde ayarladıysanız ...

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

daha sonra .contains (myObjectToCompareTo), myObjectToCompareTo'daki verileri Koleksiyondaki her Object örneğinin verileriyle değerlendirir. Öyleyse, eğer sizin eşittir yönteminiz benimkine uygun değilse, beklenmedik sonuçlar görebilirsiniz.


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

Bunu böyle yaptım, böylece birisi ararsa işe yarıyor.



0

Ayrıca, aşağıdaki gibi normal ifadelerle eşleşmeleri de kullanabilirsiniz:

boolean bool = List.matches("(?i).*SOME STRING HERE.*")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.