2015-03-26 2 views
0

У меня есть карта в Groovy:Как реализовать компаратор для карты в Groovy?

['keyOfInterest' : 1, 'otherKey': 2] 

Существует список, содержащий некоторые из этих карт. Я хочу знать, существует ли карта в списке с keyOfInterest определенного значения.

Если типы данных были простыми объектами, я мог бы использовать indexOf(), но я не знаю, как это сделать с более сложным типом. Например. (Взято из docs)

assert ['a', 'b', 'c', 'd', 'c'].indexOf('z') == -1 // 'z' is not in the list 

Я хотел бы сделать что-то вроде:

def mapA = ['keyOfInterest' : 1, 'otherKey': 2] 
def mapB = ['keyOfInterest' : 3, 'otherKey': 2] 
def searchMap = ['keyOfInterest' : 1, 'otherKey': 5] 
def list = [mapA, mapB] 

assert list.indexOf(searchMap) == 0 // keyOfInterest == 1 for both mapA and searchMap 

Есть ли способ сделать это с помощью более сложных объектов, таких как карты, легко?

ответ

0

Простейшим вариантом было бы использовать find(). Он возвращает значение null, если критерии не выполняются в поставляемом закрытии.

def mapA = ['keyOfInterest' : 1, 'otherKey': 2] 
def mapB = ['keyOfInterest' : 3, 'otherKey': 2] 
def list = [mapA, mapB] 

assert list.find { it.keyOfInterest == 1 } == ['keyOfInterest':1, 'otherKey':2] 
assert !list.find { it.keyOfInterest == 7 } 
+0

В то время как это работает, он не находит ИНДЕКС, как указано в примерах ... вот почему findIndexOf() – billjamesdev

+0

с использованием 'indexOf()' (похоже на JavaScript) был одним из подходов, используемых для поиска присутствия элемента. Однако 'findIndexOf (groovy.lang.Closure)' принимает замыкание, подобное 'find()'. Это дает хороший момент. С Groovy 2.4, 'indexed()' преобразует список, чтобы создать карту, где индекс каждого элемента становится ключом. – dmahapatro

1

Хотя @dmahapatro правильно, и вы можете использовать find() найти карту в списке карт, который имеет индекс соответствия ... это не то, что вы просили. Поэтому я покажу, как вы можете получить либо индекс этой записи в списке, либо просто наличие карты с соответствующим ключом.

def mapA = ['keyOfInterest' : 1, 'otherKey': 2] 
def mapB = ['keyOfInterest' : 3, 'otherKey': 2] 
def searchMap = ['keyOfInterest':1, 'otherKey': 55 ] 
def list = [mapA, mapB] 

// findIndexOf() returns the first index of the map that matches in the list, or -1 if none match 
    assert list.findIndexOf { it.keyOfInterest == searchMap.keyOfInterest } == 0 
    assert list.findIndexOf { it.keyOfInterest == 33 } == -1 

// any() returns a boolean OR of all the closure results for each entry in the list. 
    assert list.any { it.keyOfInterest == searchMap.keyOfInterest } == true 
    assert list.any { it.keyOfInterest == 33 } == false 

Обратите внимание, что при использовании одного над другим не существует штрафа за исполнение, поскольку все они останавливаются, как только будет найдено одно совпадение. find() дает вам больше информации, но если вы действительно ищете индекс или логический результат, эти другие также могут быть использованы.

Смежные вопросы