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

Author: Matouš Klugar, 2018-08-07

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
 2
Author: Michael Easter, 2018-08-07 09:37:48

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

 2
Author: Rahul Mahadik, 2018-08-10 04:37:46

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
 1
Author: injecteer, 2018-08-07 09:31:46

Ce code devrait résoudre le problème

 List listOfDuplicates = inputList;
 listOfDuplicates.removeAll{
    listOfDuplicates.count(it) == 1
 }
 1
Author: Prashant, 2018-08-07 09:31:57

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]
 1
Author: Paul King, 2018-08-07 10:27:09

Plus on est de fous:

groovy:000> list.groupBy().values()*.tail().flatten()
===> [1, 1, 1, 3, 3, 2, 7, 8]
  1. Group by identity (il s'agit essentiellement d'une fonction "fréquences").
  2. Prenez juste les valeurs
  3. Couper le premier élément
  4. Combiner les listes
 0
Author: cfrick, 2018-08-08 07:38:05