J'utilise tout en boucle pour lire un fichier texte et créer de nouvelles arraychistes sur des portions du fichier texte, puis placez ces arraychistes dans une autre arraylist. Mon problème est que je ne sais pas comment ajouter mon arraylist temporaire d'analyse de la mainaliste, puis de l'effacer pour la boucle suivante sans affecter toutes les arraylistes d'analyse à l'intérieur de l'arraylist Ceci est un code exemple, il s'agit d'un fichier plus important. Il est raccourci mais a toutes les pièces mobiles p> le fichier lue est comme ceci: F h etc .. p> p>
un
b
C
d p>
g p>
i
j
k
l p>
3 Réponses :
Il y a deux problèmes avec votre approche actuelle:
Anse code> utilisera la même référence pour tous les arraylistes internes, donc lorsque vous appelez pars.clear () code> Il videra toutes les listes intérieures de votre mainalisateur < / code>. Cela peut être résolu en créant une copie de la liste code> parse code> lorsque vous l'ajoutez (c'est-à-dire mainalisaliste.add (nouveau arraylist <> (parse)); >) li>
- Vous souhaitez effacer la liste à l'intérieur du si, après avoir ajouté la copie à votre
mainaliste code>. Li>
ol> En outre, je suppose que vous ne voulez pas que les lignes vides ajoutées à la liste intérieure individuelle. Vous pouvez donc lire la ligne d'abord et ajouter la liste complète à Mainaliste Code> et clair parse code> à l'intérieur de l'instruction IF ou ajoutez la ligne au parse code> -list. p> une alternative légèrement meilleure, c'est simplement créer un Nouvelle liste à la place, vous n'aurez donc pas besoin du effacer code> et de créer une copie de la liste. p> au total: p> xxx pré> < p> Essayez-le en ligne. Strong> p> p>
Essayez ceci au lieu d'effacer la liste à chaque fois.
ArrayList<ArrayList<String>> mainAList = new ArrayList<ArrayList<String>>(); try (Scanner filereader = new Scanner(Paths.get("name_of_file.txt"))) { while (filereader.hasNextLine()) { ArrayList<String> parse = new ArrayList<>(); parse.add(filereader.nextLine()); if (parse.get(parse.size()-1).length() == 0 || !filereader.hasNextLine()) { mainAList.add(parse); } } }
Votre problème est que votre Remplacez ceci Ligne p> avec cette p> mainaliste code> sera vide à la fin, car les objets sont des types de référence. Afin de résoudre ce problème, vous devez ajouter une copie de
parse code> dans le
mainaliste code> et non la liste code> arrayliste elle-même
Essayez de faire
mainalisaliste.add (parse.copy ()) code> à la place, vous ajoutez une copie i> de la liste au lieu d'ajouter la liste elle-même plusieurs fois. Cela, ou déplacez la ligne où vous créez
Analysez code> à l'intérieur du
pendant que code> boucle de sorte qu'il en fait un nouveau à chaque fois.