我知道在Groovy中,如果
list = [1,2,3,1]
Run Code Online (Sandbox Code Playgroud)
什么时候
list.unique()
Run Code Online (Sandbox Code Playgroud)
带着回归
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
但是,如果我想检测列表中重复,非连续项目的重复值.我怎样才能做到这一点?
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
Run Code Online (Sandbox Code Playgroud)
谢谢.
编辑:添加这两种情况
detect([1,2,2,1]) => true
detect([1,2,1,1]) => true
Run Code Online (Sandbox Code Playgroud)
true表示发生任何非连续的重复.
小智 6
如果您需要获取重复元素:
def nonUniqueElements = {list ->
list.findAll{a -> list.findAll{b -> b == a}.size() > 1}.unique()
}
assert nonUniqueElements(['a', 'b', 'b', 'c', 'd', 'c']) == ['b', 'c']
Run Code Online (Sandbox Code Playgroud)
要确定集合是否包含非唯一项(前两个示例),您可以执行以下操作:
def a = [1, 2, 3, 1]
boolean nonUnique = a.clone().unique().size() != a.size()
Run Code Online (Sandbox Code Playgroud)
(注意unique()修改列表).
与此同时,Collection.unique()就"分组"项目(最后三个例子)而言,似乎做了你所要求的.
编辑:unique()无论集合是否已排序,都能正常工作.
小智 5
应该这样做:
List list = ["a", "b", "c", "a", "d", "c", "a"]
Run Code Online (Sandbox Code Playgroud)
和
list.countBy{it}.grep{it.value > 1}.collect{it.key}
Run Code Online (Sandbox Code Playgroud)
您应该能够metaClass列出并添加您自己的detect方法,如下所示:
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
Run Code Online (Sandbox Code Playgroud)