J'ai deux collections - une ArrayList et une Stack. J'utilise la pile car j'avais besoin de fonctionnalités pop/push simples pour ce bit de code. La ArrayList est essentiellement la variable out car c'est une petite section de code dans la fonction. Par conséquent, les variables sont définies comme telles, puis le code est exécuté pour ajouter des éléments à la pile.Méthode la plus efficace pour inverser une pile et l'ajouter à une ArrayList
ArrayList<String> out = new ArrayList<String>();
/* other code.. */
Stack<String> lineStack = new Stack<String>();
/* code that adds stuff to the stack */
La question est, maintenant que j'ai une pile entièrement rempli, comment puis-je placer dans le hors ArrayList dans un ordre inverse puis de l'ordre pop.
Ma première pensée en solution était
while(!lineStack.empty()) {
out.add(0, lineStack.pop());
}
... qui fonctionne, mais je crains de l'efficacité de l'ajout d'un élément au début de la ArrayList (qui oblige tous les éléments existants doivent changer. c'est une liste chaînée (je crois) .. grosse affaire ... mais toujours un souci). Aussi, je cours ceci à travers une boucle ... peut-être inutilement. Donc, ma deuxième solution qui n'a pas impliqué de boucle (au moins dans mon code, je suis sûr que les appels back end le font). Je sais que je n'ai pas besoin d'allouer la liste, mais il va garder pour un code plus propre. Cependant, je ne suis pas sûr si cela me donnera un gain de performance particulièrement utile. Donc, ma question est la suivante: laquelle de ces options sera probablement la plus efficace pour les ensembles de taille petite à moyenne? S'il y a une solution plus efficace, quelle serait-elle?
Ajout au début de 'ArrayList' est coûteuse; c'est un 'ArrayList' pas un' LinkedList'. L'ajouter au début est 'O (n^2)'. – notnoop
Veuillez noter que 'Stack' est une sous-classe de' Vector' (qui est presque similaire à 'ArrayList'). Une fois déchargé, peut-être que vous pouvez juste comme «Vector» au lieu de copier la liste. – notnoop
C'est ce que je pensais. Il s'avère que je vais juste avec la méthode out.addAll (lineStack). Je n'ai même pas besoin de le transformer en objet liste. Ce sont des frais généraux inutiles. L'itérateur de la Stack jouera la bonne direction en dépit d'être un stack –