Encore une fois, cela semble être quelque chose qui devrait être évident.Comment insérer quelque chose à une position spécifique d'une liste LinkedList mutable?
Je voudrais insérer un élément dans une liste liée à un emplacement spécifique.
Dans un cas, c'est là un champ dans l'élément est inférieure à une certaine valeur, donc je peux le faire de cette façon:
def Add(act:Elem):Unit = {
val (before, after) = myList.partition(elem.n >= _.n)
myList = (before :+ act) ++ after
}
... mais ce qui est vraiment une approche immuable déguisée en un mutable. Je ne pense pas que je puisse obtenir le noeud LinkedList qui correspond au point d'insertion, donc je ne peux pas jouer avec l'attribut "next".
Cela ne devrait pas être si difficile. La moitié du point des listes chaînées est si vous insérez des choses au milieu.
Je suis encore en train de jouer avec un générateur de compilateur (comme dans this question). Remplacer des listes avec des copies n'est pas la solution, car il y a beaucoup d'appels récursifs au cours desquels les listes sont délibérément modifiées, vous pouvez donc constater que certains des appels récursifs utilisent toujours les listes que vous venez de remplacer. Je veux vraiment des listes mutables, et des opérations mutables simples. Je suppose que je peux écrire mes propres cours de collection, mais je ne pense pas que le besoin soit aussi inhabituel. Quelqu'un a-t-il déjà mis en place des listes de liens multilingues «appropriées»?
EDIT
Un peu plus en détail
j'aurais peut-être choisi un autre exemple. Généralement, j'ai une référence à l'élément par un autre chemin, et je veux insérer un nouvel élément dans l'une des listes chaînées sur lesquelles cet élément est activé (je serais content que l'élément soit dans une liste chaînée en tant que start)
Dans l'implémentation Java naïve que je commence, l'élément lui-même contient un champ next
(que je peux ensuite manipuler). Dans le cas Scala LinkedList, le noeud de la liste liée contient une référence à l'élément, et donc, étant donné l'élément, je ne trouve pas facilement le noeud LinkedList et donc le champ suivant. Je peux à nouveau parcourir la liste, mais cela pourrait être très long.
Il peut être utile de supposer une liste DoublyLinkedList et de supprimer l'élément en tant qu'opération, car il est plus clair que cette traversée n'est pas nécessaire et doit donc être évitée. Dans ce cas, supposons que j'ai trouvé l'élément par d'autres moyens que de parcourir la liste chaînée. Je veux maintenant supprimer l'élément. Dans le cas Java/naïf, les pointeurs avant et arrière font partie de l'élément. Dans le cas des collections Scala, il existe un noeud DoublyLinkedList quelque part qui contient une référence à mon élément. Mais je ne peux pas passer de l'élément à ce nœud sans avoir à parcourir à nouveau la liste. Les pensées aléatoires suivent: Je vais quelque part en mélangeant un trait qui définit un champ suivant (pour mon cas singulièrement lié). Ce trait peut prendre en charge l'itération sur les objets de la liste, par exemple. Mais cela m'aiderait seulement pour les éléments qui sont sur une liste à la fois et j'ai des objets qui sont sur trois (avec, actuellement, trois différents "prochains" pointeurs appelés des choses comme "nezt", "across" et "down") .
Je ne veux pas une liste de nœuds pointant vers des éléments, je veux une liste d'éléments qui sont des nœuds (c'est-à-dire qui ont un champ suivant).
Merci, mais je pense que je vous ai mal orienté avec mon exemple. S'il vous plaît voir mon edit à la question –
@Paul - Je pense qu'il ya une meilleure façon d'atteindre ce que vous voulez (voir ma réponse modifiée). –
Hmm. Les conversions implicites semblent prometteuses. Laissez-moi partir et cogiter un peu ... –