Как сделать Groovy массивы сопоставимыми? - PullRequest
0 голосов
/ 09 февраля 2011

Попробовал так:

   ArrayList.metaClass.compareTo = {arg -> this?.size() <=> arg?.size() }  
   [1]<=>[2]

Не работает.

Все еще возникают исключения groovy.lang.GroovyRuntimeException: Cannot compare java.util.ArrayList with value '[1]' and java.util.ArrayList with value '[2]'

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

Один из подходов - реализовать интерфейс Comparator.

Другой - использовать metaClass так, как вы хотели, однако вы не сможете использовать оператор <=>, поскольку List не делаетне реализуем Comparable.

List.metaClass.compareTo = { Collection other ->
    delegate.size() <=> other?.size()
}

def x = [1, 2, 3]
def y = [4, 5]

println x.compareTo(y)  // but x <=> y won't work
0 голосов
/ 19 февраля 2016

Вы можете пометить список как сопоставимый:

List.metaClass.compareTo = { other ->
    delegate[0] <=> other[0]
}
assert ([1,2] as Comparable) <=> ([3,4] as Comparable) == -1
assert ([3,4] as Comparable) <=> ([1,2] as Comparable) == 1
assert ([3,4] as Comparable) <=> ([3] as Comparable) == 0
0 голосов
/ 11 февраля 2011

я должен спросить ... почему ты хочешь это сделать?
все операторы сравнения зависят от класса, реализующего Comparable, а не только от метода CompareTo, и я не думаю, что этот интерфейс можно принудительно установить в существующем классе.
афаик, тебе понадобится другой подход

...