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?
3 réponses
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
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
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
De nouvelles questions
groovy
Groovy est un langage de programmation orienté objet pour la plate-forme Java. Il s'agit d'un langage dynamique avec des fonctionnalités similaires à celles de Python, Ruby, Perl et Smalltalk. Il peut être utilisé comme langage de script pour la plate-forme Java.