J'ai le code Java) suivant, dans lequel je tente de copier ArrayList dans un autre ArrayList.
ArrayList<String> nodes = new ArrayList<String>();
ArrayList NodeList=new ArrayList();
ArrayList list=new ArrayList();
for(int i=0;i<PropertyNode.getLength()-1;i++){
Node childNode = PropertyNode.item(i);
NodeList Children = childNode.getChildNodes();
if(Children!=null){
nodes.clear();
nodes.add("PropertyStart");
nodes.add(Children.item(3).getTextContent());
nodes.add(Children.item(7).getTextContent());
nodes.add(Children.item(9).getTextContent());
nodes.add(Children.item(11).getTextContent());
nodes.add(Children.item(13).getTextContent());
nodes.add("PropertyEnd");
}
NodeList.addAll(nodes);
list.add(NodeList);
}
Je veux que le tableau "list" soit dans ce format:
[[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,d,e,f,PropertyEnd],[PropertyStart,......]]
Mais à partir du code ci-dessus, la sortie du tableau "list" se présente comme suit:
[PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,....PropertyEnd]
Je pense que vous avez peut-être remarqué la différence. Je ne parviens pas à obtenir le résultat au format attendu. S'il vous plaît me suggérer une solution !! Merci d'avance!!
Alors vous avez besoin d'un ArrayList
de ArrayLists
:
ArrayList<ArrayList<String>> nodes = new ArrayList<ArrayList<String>>();
ArrayList<String> nodeList = new ArrayList<String>();
nodes.add(nodeList);
Notez que NodeList
a été remplacé par nodeList
. Dans Conventions de dénomination Java , les variables commencent par une minuscule. Les cours commencent par une majuscule.
Principalement, vous avez 2 problèmes majeurs:
Vous utilisez l'ajout d'un List
de String
s. Vous voulez un List
contenant List
s de Strings
.
Notez également que lorsque vous appelez ceci:
NodeList.addAll(nodes);
... tout ce que vous dites est d'ajouter tous les éléments des nœuds (qui est une liste de chaînes) au (mal nommé) NodeList
, qui utilise des objets et n'ajoute donc que les chaînes qu'il contient. Ce qui m'amène au point suivant.
Vous semblez confus entre vos nodes
et NodeList
. Votre NodeList
continue de croître avec le temps, et c'est ce que vous ajoutez à votre liste.
Donc, même si nous faisions bien les choses, si nous examinions la fin de chaque itération avec votre nodes
, nodeList
et list
, nous verrions:
i = 0
nodes: [PropertyStart,a,b,c,PropertyEnd]
nodeList: [PropertyStart,a,b,c,PropertyEnd]
list: [[PropertyStart,a,b,c,PropertyEnd]]
i = 1
nodes: [PropertyStart,d,e,f,PropertyEnd]
nodeList: [PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd]
list: [[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd]]
i = 2
nodes: [PropertyStart,g,h,i,PropertyEnd]
nodeList: [PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,g,h,i,PropertyEnd]
list: [[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,g,h,i,PropertyEnd]]
et ainsi de suite ...
N'utilisez pas de noms de variables commençant par des lettres majuscules. Donc ici, remplacez NodeList
par nodeList
).
Vous dites "je veux la" liste "tableau [...]". C'est déroutant pour qui que ce soit avec qui vous communiquerez: ce n'est pas un tableau. C'est une implémentation de List
sauvegardée par un tableau.
Il y a une différence entre un type, une interface et une implémentation.
Utilisez des types génériques, car le typage statique aide vraiment à résoudre ces erreurs. De plus, utilisez des interfaces si possible, sauf si vous avez une bonne raison d'utiliser le type concret.
Donc, votre code devient:
List<String> nodes = new ArrayList<String>();
List<String> nodeList = new ArrayList<String>();
List<List<String>> list = new ArrayList<List<String>>();
Vous pouvez supprimer complètement nodeList
et écrire ce qui suit une fois que vous avez corrigé vos types:
list.add(nodes);
Sauf si vous avez une très bonne raison de le faire, préférez utiliser la portée la plus interne pour déclarer des variables, limiter leur durée de vie pour leurs références et faciliter la séparation des problèmes dans votre code.
Ici, vous pouvez alors déplacer List<String> nodes
Pour être déclaré dans la boucle (puis oublier l'invocation nodes.clear()
).
Une bonne raison de ne pas faire cela pourrait être la performance, car vous voudrez peut-être éviter de recréer un ArrayList
à chaque itération de la boucle, mais il est très peu probable que cela vous préoccupe (et le code propre, lisible et maintenable a la priorité sur le code préoptimisé ).
Dernier point mais non le moindre, si vous souhaitez obtenir de l’aide, donnez-nous le cas exactement reproductible avec un exemple court, correct, complet .
Ici, vous nous donnez les résultats de votre programme, mais ne mentionnez pas comment vous les avez obtenus, nous devons donc supposer que vous avez fait une System.out.println(list)
. Et vous avez confondu beaucoup de gens, car je pense que les résultats que vous nous donnez ne sont pas ceux que vous avez obtenus.
Ne serait-ce pas juste un cas de:
ArrayList<ArrayList<String>> outer = new ArrayList<ArrayList<String>>();
ArrayList<String> nodeList = new ArrayList<String>();
// Fill in nodeList here...
outer.add(nodeList);
Répéter au besoin.
Cela devrait vous retourner une liste dans le format que vous avez spécifié.
Le problème que vous avez est que vous utilisez le même ArrayList NodeList sur toutes les itérations dans la boucle principale pour. Chaque itération NodeList est agrandie par de nouveaux éléments.
Après la première boucle, NodeList a 5 éléments (PropertyStart, a, b, c, PropertyEnd) et liste a 1 élément (NodeList: (PropertyStart, a, b, c, PropertyEnd))
Après la deuxième boucle NodeList a 10 éléments (PropertyStart, a, b, c, PropertyEnd, PropertyStart, d, e, f, PropertyEnd) et liste a 2 éléments (NodeList ( avec 10 éléments), NodeList (avec 10 éléments))
Pour obtenir vos attentes, vous devez remplacer
NodeList.addAll(nodes);
list.add(NodeList)
par
List childrenList = new ArrayList(nodes);
list.add(childrenList);
PS Votre code n'est pas lisible, conservez Java doivent avoir un code lisible. Par exemple, il est difficile de reconnaître si NodeList est une classe ou un objet
Initiez la liste de noeuds dans la boucle for et vous obtiendrez la sortie souhaitée.
ArrayList<String> nodes = new ArrayList<String>();
ArrayList list=new ArrayList();
for(int i=0;i<PropertyNode.getLength()-1;i++){
ArrayList NodeList=new ArrayList();
Node childNode = PropertyNode.item(i);
NodeList Children = childNode.getChildNodes();
if(Children!=null){
nodes.clear();
nodes.add("PropertyStart");
nodes.add(Children.item(3).getTextContent());
nodes.add(Children.item(7).getTextContent());
nodes.add(Children.item(9).getTextContent());
nodes.add(Children.item(11).getTextContent());
nodes.add(Children.item(13).getTextContent());
nodes.add("PropertyEnd");
}
NodeList.addAll(nodes);
list.add(NodeList);
}
Explication: NodeList est un objet qui reste identique tout au long de la boucle. L'ajout de la même variable à la liste d'une boucle ne l'ajoutera donc qu'une seule fois. La boucle n’ajoute que ses variables dans un seul tableau NodeList, vous devez donc voir
[/*list*/ [ /*NodeList*/ ] ]
et NodeList contient [prostart, a, b, c, proend, prostart, d, e, f, proend ...]
Tout d'abord, déclarera Arraylist externe qui contiendra un autre Arraylist interne
ArrayList> CompletesystemStatusArrayList; ArrayList systemStatusArrayList
CompletesystemStatusArrayList = new ArrayList
systemStatusArrayList = new ArrayList ();
systemStatusArrayList.add("1");
systemStatusArrayList.add("2");
systemStatusArrayList.add("3");
systemStatusArrayList.add("4");
systemStatusArrayList.add("5");
systemStatusArrayList.add("6");
systemStatusArrayList.add("7");
systemStatusArrayList.add("8");
CompletesystemStatusArrayList.add(systemStatusArrayList);