Si vous avez une liste de chaînes af, comment filtrer si les voisins égaux n'en apparaissent qu'un?

Exemple:

['0.1', '0.1', '0.2','0.3','0.3','0.1','0.2'] 

Devrait se traduire par

['0.1', '0.2','0.3','0.1','0.2'] 

Notez que les éléments 0, 1 n'apparaissent qu'une seule fois et les éléments 4 et 5 n'apparaissent également qu'une seule fois.

Si utiliser unique:

['0.1', '0.1', '0.2','0.3','0.3','0.1','0.2'].unique()

Le résultat sera:

['0.1', '0.2','0.3'] //what is not wanted

Des suggestions pour la meilleure méthode groovy?

0
Dasma 24 nov. 2017 à 15:13

3 réponses

Meilleure réponse

Donc, si vous voulez supprimer les voisins dupliqués, vous devriez obtenir l'élément suivant de la boucle actuelle. je viens de quelque chose comme ça:

def example =  ['0.1', '0.1', '0.2','0.3','0.3','0.1','0.2']
def array = []
example.eachWithIndex { item, index ->
    def next = index  < example.size() - 1 ? example[ index  + 1 ] : null
    if(next != item) {
        array.push(item)
    }
}

println array ​
1
fsi 24 nov. 2017 à 12:30

Une autre manière plus fonctionnelle est la suivante, en utilisant inject (connu dans d'autres langues sous le nom de reduction ):

def example = ['0.1','0.1','0.2','0.3','0.3','0.1','0.2']

def array = example.inject([example[0]]) { acc, val ->
    if (val != acc[-1]) { acc << val }
    acc
}

assert ['0.1','0.2','0.3','0.1','0.2'] == array

La clé est de commencer avec un tableau contenant le premier élément, [example[0]], puis d'itérer sur example. inject fournit à la fois l'accumulation en cours et la valeur. Si nous ajoutons une ligne de journal:

def array = example.inject([example[0]]) { acc, val ->
    println "acc: ${acc} val: ${val}"
    if (val != acc[-1]) { acc << val }
    acc
}

Alors la sortie est:

acc: [0.1] val: 0.1
acc: [0.1] val: 0.1
acc: [0.1] val: 0.2
acc: [0.1, 0.2] val: 0.3
acc: [0.1, 0.2, 0.3] val: 0.3
acc: [0.1, 0.2, 0.3] val: 0.1
acc: [0.1, 0.2, 0.3, 0.1] val: 0.2
1
Michael Easter 4 déc. 2017 à 13:26

Une option simple consiste à effectuer une itération avec une valeur de fin:

def example =  ['0.1', '0.1', '0.2','0.3','0.3','0.1','0.2']
def array = []
def trailing = -999

example.each { item ->
    if (item != trailing) { array << item }
    trailing = item 
}

assert ['0.1','0.2','0.3','0.1','0.2'] == array
2
Michael Easter 27 nov. 2017 à 03:10
47473090