2013-05-30 3 views
6

Ich weiß, dass in Groovy, wennGroovy: der einfachste Weg, um doppelte, nicht aufeinanderfolgende Werte in einer Liste zu erfassen

list = [1,2,3,1] 

wenn

list.unique() 

mit Rück

[1,2,3] 

Aber wenn ich doppelten Wert für doppelte, nicht aufeinanderfolgende Elemente in einer Liste erkennen möchte. Wie kann ich das machen?

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 

Danke.

Edit: fügen diese beiden Fälle

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

wahr: jede nicht-konsekutiv, duplizieren auftreten.

Antwort

2

Sie sollten wie unten Ihre eigene detect Methode metaClass Liste können und fügen:

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 
+0

Sehr gut! Ich möchte nur wissen, wie '' Ref «bedeutet eine leere Liste in Ihrem Code? –

+1

Ja genau. Ich kann versuchen, die MetaClass-Implementierung mehr zu optimieren, wenn sie grooviger sein kann. – dmahapatro

+0

oops, '[1,2,2,1] .detect()' und '[1,2,1,1] .detect()' return false, aber ich denke, dass es wahr sein sollte. Ich vermisse diese beiden Fälle, wenn ich die Frage definiere. –

5

Um zu bestimmen, ob eine Sammlung nicht-eindeutige Elemente (die ersten beiden Beispiele) enthält, können Sie etwas tun können:

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

(Beachten Sie, dass unique() die Liste modifiziert).

In der Zwischenzeit scheint Collection.unique() zu tun, was Sie gebeten haben, bis zum Gruppieren von Elementen (Ihre letzten drei Beispiele).

Bearbeiten: unique() funktioniert ordnungsgemäß unabhängig davon, ob die Auflistung sortiert ist.

+0

Danke! Aber diese Methode kann die Folgerichtigkeit des Listenelements nicht erkennen, oder? –

+0

Nein, es kann nicht - es war nicht klar, dass Sie das verlangten. – GreyBeardedGeek

2

Dies sollte es tun:

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

und

list.countBy{it}.grep{it.value > 1}.collect{it.key} 
0

Falls Sie müssen doppelte Elemente erhalten:

def nonUniqueElements = {list -> 
     list.findAll{a -> list.findAll{b -> b == a}.size() > 1}.unique() 
    } 

    assert nonUniqueElements(['a', 'b', 'b', 'c', 'd', 'c']) == ['b', 'c'] 
Verwandte Themen