Recherche de doublons dans une liste / un fichier. [Groovy / Java]
J'ai un fichier d'entrée où chaque ligne est une inscription spéciale. Je travaillerais volontiers au niveau du fichier, mais cela pourrait être un moyen plus pratique de transférer le fichier dans une liste. (chaque objet de la liste = chaque ligne du fichier) Dans le fichier d'entrée, il peut y avoir plusieurs lignes en double. L'objectif: Diviser le fichier/liste donné en enregistrements uniques et en doublons, c'est-à-dire, les enregistrements qui sont présents plusieurs fois, conservent une occurrence et d'autres pièces en double dans une nouvelle liste J'ai trouvé un facile comment supprimer les doublons mais jamais trouvé un moyen de les stocker
File inputFile = new File("....")
inputFile.eachLine { inputList.add(it) } //fill the list
List inputList = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
inputList = inputList.unique() // remove duplicates
println inputList
// inputList = [1, 3, 2, 4, 5, 6, 7, 8, 9, 10]
La sortie devrait ressembler à: Deux listes / fichiers avec des doublons supprimés et des doublons lui-même
inputList = [1,3,2,4,5,6,7,8,9,10] //only one ocurance of each line
listOfDuplicates = [1,1,1,3,3,2,7,8] //duplicates removed from original list
La sortie n'a pas besoin de correspondre à l'ordre initial des éléments. Merci pour votre aide, Matt
6 answers
Vous pouvez simplement parcourir la liste vous-même:
def inputList = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
def uniques = []
def duplicates = []
inputList.each { uniques.contains(it) ? duplicates << it : uniques << it }
assert inputList.size() == uniques.size() + duplicates.size()
assert uniques == [1,3,2,4,5,6,7,8,9,10] //only one ocurance of each line
assert duplicates == [1,3,1,2,3,1,7,8] //duplicates removed from original list
inputList = uniques // if desired
Il y a plusieurs façons de le faire,voici la façon la plus simple
def list = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
def unique=[]
def duplicates=[]
list.each {
if(unique.contains(it))
duplicates.add(it)
else
unique.add(it)
}
println list //[1, 1, 3, 3, 1, 2, 2, 3, 4, 1, 5, 6, 7, 7, 8, 9, 8, 10]
println unique //[1, 3, 2, 4, 5, 6, 7, 8, 9, 10]
println duplicates //[1, 3, 1, 2, 3, 1, 7, 8]
J'espère que cela vous aidera
Quelque Chose de très simple:
List inputList = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
def uniques = [], duplicates = []
Iterator iter = inputList.iterator()
iter.each{
iter.remove()
inputList.contains( it ) ? ( duplicates << it ) : ( uniques << it )
}
assert [2, 3, 4, 1, 5, 6, 7, 9, 8, 10] == uniques
assert [1,1,3,3,1,2,7,8] == duplicates
Ce code devrait résoudre le problème
List listOfDuplicates = inputList;
listOfDuplicates.removeAll{
listOfDuplicates.count(it) == 1
}
Si l'ordre des doublons n'est pas important:
def list = [1,1,3,3,1,2,2,3,4,1,5,6,7,7,8,9,8,10]
def (unique, dups) = list.groupBy().values()*.with{ [it[0..0], tail()] }.transpose()*.sum()
assert unique == [1,3,2,4,5,6,7,8,9,10]
assert dups == [1,1,1,3,3,2,7,8]
Plus on est de fous:
groovy:000> list.groupBy().values()*.tail().flatten()
===> [1, 1, 1, 3, 3, 2, 7, 8]
- Group by identity (il s'agit essentiellement d'une fonction "fréquences").
- Prenez juste les valeurs
- Couper le premier élément
- Combiner les listes