Groovy: the easiest way to detect duplicate, endless values โ€‹โ€‹in a list

I know that in groovy if

list = [1,2,3,1] 

when

 list.unique() 

with return

 [1,2,3] 

But if I want to find a duplicate value for duplicate, inconsistent items in a list. How can i do this?

 detect([1,2,3,1]) => true detect([1,2,3,2]) => true detect([1,1,2,3]) => false detect([1,2,2,3,3]) => false detect([1,2,3,4]) => false 

Thanks.

Edit: add these two cases

 detect([1,2,2,1]) => true detect([1,2,1,1]) => true 

true means that any non-sequential duplication occurs.

+6
source share
4 answers

You should be able to metaClass and add your own detect method, as shown below:

 List.metaClass.detect = { def rslt = delegate.inject([]){ ret, elem -> ret << (ret && ret.last() != elem ? elem : !ret ? elem : 'Dup') } return (!rslt.contains('Dup') && rslt != rslt.unique(false)) } assert [1,2,3,1].detect() == true //Non-consecutive Dups 1 assert [1,2,3,2].detect() == true //Non-consecutive Dups 2 assert [1,1,2,3].detect() == false //Consecutive Dups 1 assert [1,2,2,3,3].detect() == false //Consecutive Dups 2 and 3 assert [1,2,3,4].detect() == false //Unique no dups 
+2
source

To determine if a collection contains non-unique elements (the first two examples), you can do something like this:

 def a = [1, 2, 3, 1] boolean nonUnique = a.clone().unique().size() != a.size() 

(Note that unique() modifies the list).

Meanwhile, Collection.unique() seems to do what you set, including โ€œgroupingโ€ the elements (your last three examples).

Edit: unique() works correctly regardless of whether the collection is sorted.

+5
source

This should do it:

 List list = ["a", "b", "c", "a", "d", "c", "a"] 

and

 list.countBy{it}.grep{it.value > 1}.collect{it.key} 
+2
source

If you need to get duplicate elements:

  def nonUniqueElements = {list -> list.findAll{a -> list.findAll{b -> b == a}.size() > 1}.unique() } assert nonUniqueElements(['a', 'b', 'b', 'c', 'd', 'c']) == ['b', 'c'] 
0
source

Source: https://habr.com/ru/post/946140/


All Articles