Je ne peux pas modéliser l'élément de liste de cette façon: après exécution, ce code éléments de cette liste sont inchangés
Comment atteindre l'itération avec modyfing via la liste de la manière la plus simple. P> p>
7 Réponses :
Les chaînes Java sont immuables, elles ne peuvent donc pas être modifiées. En outre, si vous souhaitez modifier une liste, utilisez l'interface Itératrice. p>
La seule modification L'interface Itératrice permet une suppression. L'interface Lisiteratorator, d'autre part, a défini () et ajoutez () méthodes.
Etant donné que String code> Les objets sont immuables, vous ne pouvez pas modifier les valeurs que vous êtes itération. De plus, vous ne pouvez pas modifier la liste que vous êtes itération dans une telle boucle. La seule façon de le faire est de faire itérer les index de liste avec une boucle standard ou d'utiliser l'interface
lisiterator (code> code> xxx pré> p>
Non, utiliser l'index de la liste n'est pas le seul moyen et accédez à E.G. Une liste liée longue avec un indice des éléments peut fonctionner très mal. Si vous souhaitez itération et en même temps, modifiez une liste, à l'aide d'un itérateur ou de la liste de liste est meilleur.
Donc, je revenais ici que j'ai pensé à la boucle standard.
@jarnbjo: Tu as raison; Je n'étais pas encore fini. J'ai inclus les deux méthodes.
@ J2J: Non, vous pouvez itérer; C'est tout aussi simple - voir mon deuxième échantillon de code.
@Gabe: Dommage que Stackoverflow ait sur le point d'être le premier à répondre à des points de réputation de récolte. Cela ne semble pas importer si la réponse est plus bonne.
-1. La première phrase est fausse. Ce bogue n'est pas lié à l'immuabilité des chaînes.
@Finnw: veuillez souligner quelle partie est fausse. Vous ne croyez sûrement pas que les chaînes sont mutables? Et, immuables, vous ne croyez sûrement pas que vous pouvez modifier leurs valeurs, non? Si l'OP a une liste
s.insert (0, "x"); code> car un
stringbuffer code> est mutable.
@Gabe, le problème (dans la question) est que l'OP tente de modifier la liste i> via un itérateur normal, qui ne fonctionne bien sûr pas. Votre exemple lisiterator code> résout la résolution de cela. L'OP pourrait i> être confondu sur
string code> immutabilité mais qui n'est pas important (car il ne suggère pas une solution) - la liste doit toujours être modifiée. Se référant à
String Code> L'immuabilité introduit simplement plus de confusion.
@FINNW: La racine la racine i> du problème est que chaîne code> est immuable. Si l'op utilisait une liste
s = "x" + s; code> mutate la chaîne aussi facilement que possible pourrait penser que cela modifie la liste.
Dans votre boucle, vous modifiez simplement la copie locale de la chaîne. Une meilleure alternative serait d'utiliser l'itérateur de la liste et de remplacer la position actuelle de la liste. P>
éditer, oups, façon de ralentir. p>
Vous ne pouvez pas modifier un String code> élément d'une liste code> de cette façon, mais un
stringbuilder code> fonctionnerait simplement bien:
for (StringBuilder sb : list) sb.append("x");
Les chaînes sont des bêtes immuables, je peux donc recommander à suivre cette philosophie et à créer une nouvelle liste en modifiant une: Je pense que cela rendra votre code plus facile à comprendre et à entretenir. p> p>
La liste est modifiable, il n'est donc pas nécessaire de créer un nouveau.
@FINNW: Vous pouvez simplement prétendre que ce n'est pas modifiable :) ou si vous le souhaitez, vous pouvez le rendre non modifiable comme ceci: collections.unmodifiablelist (liste) code>. J'encourage juste dans cette réponse pour écrire plus de code sans effet secondaire.
Comme d'autres ont souligné:
s = "x" + s code> créera une nouvelle chaîne (qui ne sera pas contenue dans la liste) li>
- Même si vous le pouviez, la variable
s code> est une variables locales, qui, lorsqu'elles sont attribuées à, n'affectent pas les valeurs contenues dans la liste. LI>
ul> La solution est dans ce cas pour utiliser un StringBuilder CODE> qui représente une chaîne que vous peut em> modifier réellement ou pour utiliser un lisiteratorator Comme @Michael Borgwardt et @jarnbjo souligne. P>
Utilisation d'un StringBuilder Code>: P> List<String> someStrings = new LinkedList<String>();
someStrings.add("hello");
someStrings.add("world");
for (ListIterator<String> iter = someStrings.listIterator(); iter.hasNext();)
iter.set("x" + iter.next());
Je préfère utiliser pour code> avec des itérateurs (divisés sur plusieurs lignes).
tandis que code> i beaucoup de même, mais l'itérateur a une étouffement. Et des accolades, bien sûr.
Quelque chose comme ça devrait faire le travail:
Pourquoi déclarer une variable locale supplémentaire s code> et pourquoi le faire
final code>?
@aioobe: hors d'habitude; Je fais un point pour déclarer tout comme final code> sauf indication contraire. De même avec des variables. De plus, j'adore faire ceux qui font de l'optimisation prématurée. ;)
Je déclare toujours une variable de contenir le résultat de itérator.next () code> en haut du bloc, pour éviter les bogues où
suivant () code> n'est pas appelé ou est appelé plus qu'une fois dans le corps de la boucle.
@Finnw: ma règle de base est de donner aux variables la visibilité possible la plus basse i> possible. Déclarant la variable en haut du bloc le rend visible au bloc plus l'autre code qui suit.
Certaines personnes aiment le fouillis supplémentaire
@Steve: Peu importe ce qui vous fait basculer votre bateau ou quelque chose comme ça ... :)