J'essaie de lire à partir de deux fichiers et de les stocker dans deux listes distinctes. Les fichiers sont constitués de mots qui sont seuls sur une ligne ou de plusieurs mots séparés par des virgules. J'ai lu chaque fichier avec le code suivant (non complet):
ArrayList<String> temp = new ArrayList<>();
FileInputStream fis;
fis = new FileInputStream(fileName);
Scanner scan = new Scanner(fis);
while (scan.hasNextLine()) {
Scanner input = new Scanner(scan.nextLine());
input.useDelimiter(",");
while (scan.hasNext()) {
String md5 = scan.next();
temp.add(md5);
}
}
scan.close();
return temp;
Je dois maintenant lire deux fichiers et supprimer tous les mots du premier fichier qui existent également dans le deuxième fichier (il y a des mots en double dans les fichiers). J'ai essayé avec des boucles for et d'autres trucs de ce genre, mais rien n'a fonctionné, donc toute aide serait grandement appréciée!
Question bonus: j'ai également besoin de savoir combien de doublons il y a dans les deux fichiers - je l'ai fait en ajoutant les deux tableaux à un HashSet puis en soustrayant la taille de l'ensemble de la taille combinée des deux tableaux - est-ce une bonne solution, ou pourrait-on faire mieux?
Vous pouvez utiliser la méthode removeAll
pour supprimer les éléments d'une liste d'une autre liste.
Pour obtenir les doublons, vous pouvez utiliser la méthode retainAll
, bien que votre approche avec l'ensemble soit également bonne (et probablement plus efficace)
L'installation de collecte dispose d'une méthode pratique à cet effet:
list1.removeAll(list2);
Vous devez d'abord remplacer la méthode égale dans votre classe personnalisée et définir les critères de suppression de la liste correspondants
public class CustomClass{
@Override
public boolean equals(Object obj) {
try {
CustomClass licenceDetail = (CustomClass) obj;
return name.equals(licenceDetail.getName());
}
catch (Exception e)
{
return false;
}
}
}
Deuxièmement, vous appelez la méthode removeAll ()
list1.removeAll (list2);
Comme d'autres l'ont mentionné, utilisez le Collection.removeAll
si vous souhaitez supprimer tous les éléments qui existent dans une collection de la collection que vous appelez removeall
.
Quant à votre question bonus, je suis un grand fan de la classe Sets de Guava. Je suggère l'utilisation de Sets.intersection comme suit:
Sets.intersection(wordSetFromFile1, wordSetFromFile2).size();
En supposant que vous avez créé un ensemble de mots à partir des deux fichiers, vous pouvez déterminer le nombre de mots distincts qu'ils ont en commun avec cette même ligne.