9

私はGroovyでそれを知っています

list = [1,2,3,1]

いつ

list.unique()

リターン付き

[1,2,3]

しかし、リスト内の重複する非連続項目の重複値を検出したい場合。これどうやってするの?

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

ありがとう。

編集:これら2つのケースを追加

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

true は、連続しない重複が発生することを意味します。

4

5 に答える 5

9

This should do it:

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

and

list.countBy{it}.grep{it.value > 1}.collect{it.key}
于 2016-03-10T16:53:44.333 に答える
6

コレクションに一意でないアイテム (最初の 2 つの例) が含まれているかどうかを判断するには、次のようにします。

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

(リストを変更することに注意してくださいunique())。

一方、Collection.unique()「グループ化」アイテム(最後の3つの例)に関しては、あなたが求めたことを行うようです。

編集:unique()コレクションがソートされているかどうかに関係なく、適切に機能します。

于 2013-05-30T03:41:27.873 に答える
2

以下のように、独自のメソッドを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
于 2013-05-30T04:44:07.097 に答える