7
votes

Itération de la liste avec modification de chaîne

Je ne peux pas modéliser l'élément de liste de cette façon: xxx

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.


0 commentaires

7 Réponses :


2
votes

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.


1 commentaires

La seule modification L'interface Itératrice permet une suppression. L'interface Lisiteratorator, d'autre part, a défini () et ajoutez () méthodes.



17
votes

Etant donné que String 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> xxx


9 commentaires

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 , il pourrait facilement faire s.insert (0, "x"); car un stringbuffer est mutable.


@Gabe, le problème (dans la question) est que l'OP tente de modifier la liste via un itérateur normal, qui ne fonctionne bien sûr pas. Votre exemple lisiterator résout la résolution de cela. L'OP pourrait être confondu sur string 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 L'immuabilité introduit simplement plus de confusion.


@FINNW: La racine la racine du problème est que chaîne est immuable. Si l'op utilisait une liste , cette question n'aurait jamais montré en premier lieu. Si l'OP est "essayer" de muter une chaîne ou de modifier une liste n'est pas une question que nous pouvons répondre car il pourrait penser que s = "x" + s; mutate la chaîne aussi facilement que possible pourrait penser que cela modifie la liste.



1
votes

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.

éditer, oups, façon de ralentir.


0 commentaires

1
votes

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");


0 commentaires

3
votes

Les chaînes sont des bêtes immuables, je peux donc recommander à suivre cette philosophie et à créer une nouvelle liste en modifiant une: xxx

Je pense que cela rendra votre code plus facile à comprendre et à entretenir.


2 commentaires

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) . J'encourage juste dans cette réponse pour écrire plus de code sans effet secondaire.



2
votes

Comme d'autres ont souligné:

  • Vous ne pouvez pas modifier les chaînes en Java, donc 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());
    


1 commentaires

Je préfère utiliser pour avec des itérateurs (divisés sur plusieurs lignes). tandis que i beaucoup de même, mais l'itérateur a une étouffement. Et des accolades, bien sûr.



3
votes

Quelque chose comme ça devrait faire le travail: xxx


6 commentaires

Pourquoi déclarer une variable locale supplémentaire s et pourquoi le faire final ?


@aioobe: hors d'habitude; Je fais un point pour déclarer tout comme final 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 () en haut du bloc, pour éviter les bogues où suivant () 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 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 ... :)