Ponownie, wydaje się, że to coś, co powinno być oczywiste.Jak wstawić coś w określonej pozycji z mutable LinkedList?
Chciałbym wstawić element do połączonej listy w określonej pozycji.
W jednym przypadku, to jest, gdy pole w elementu jest mniejsza niż określona wartość, więc mogę zrobić to w ten sposób:
def Add(act:Elem):Unit = {
val (before, after) = myList.partition(elem.n >= _.n)
myList = (before :+ act) ++ after
}
... ale to jest naprawdę niezmienne podejście przebraniu zmienny. Nie sądzę, mogę uzyskać w węzeł LinkedList, który odpowiada punkt wstawiania, więc nie mogę zepsuć z "następny" atrybut.
To nie powinno być takie trudne. Połowa punktu połączonych list jest taka, że wstawiasz rzeczy w środku.
Ciągle mam kłopot z generatorem kompilatorów (jak w this question). Zastępowanie list kopiami nie jest po prostu sposobem na to, ponieważ istnieje wiele wywołań rekursywnych, podczas których listy są celowo modyfikowane, więc niektóre rekurencyjne wywołania wciąż używają właśnie zamienionych list.
Naprawdę chcę listy zmienne i proste operacje zmienne. Myślę, że mogę napisać własne zajęcia z kolekcji, ale nie sądzę, że potrzeba jest taka niezwykła. Ktoś zaimplementował już "właściwe" listy z linkami wielostronnymi?
EDIT
Niektóre bardziej szczegółowo
I powinny być może wybrany inny przykład. Zazwyczaj mam odwołanie do elementu inną trasą i chcę wstawić nowy element na jednej z połączonych list, na których ten element jest włączony (byłbym zadowolony z elementu znajdującego się na jednej połączonej liście jako start)
W naiwnej implementacji języka Java, od której zaczynam, sam element zawiera pole next
(które następnie można modyfikować).
W przypadku Scala LinkedList, połączony węzeł listy zawiera odniesienie do elementu, a zatem, biorąc pod uwagę element, nie mogę łatwo znaleźć węzła Lista odnośników, a więc następnego pola. Mogę ponownie przejść przez listę, ale może to być bardzo długa.
Pomocne może być założenie Podwójnej Linii Linii i usunięcie elementu jako operacji, którą chcę wykonać, ponieważ jest bardziej jasne, że przemieszczenie nie jest potrzebne i dlatego powinno się go unikać. W takim przypadku załóżmy, że znalazłem element w inny sposób niż przechodzenie przez połączoną listę. Teraz chcę usunąć ten element. W przypadku Java/naiwność wskaźniki tylny i przedni są częścią elementu. W przypadku kolekcji Scala istnieje gdzieś węzeł DoublyLinkedList zawierający odniesienie do mojego elementu. Ale nie mogę przejść od elementu do tego węzła bez ponownego przeglądania listy.
Losowe myśli następują: Dostaję się gdzieś poprzez zmieszanie cechy, która definiuje kolejne pole (dla mojej pojedynczo połączonej sprawy). Ta cecha może na przykład wspierać iterację obiektów na liście. Ale to pomogłoby mi tylko dla elementów znajdujących się na jednej liście na raz i mam obiekty, które są na trzech (z, obecnie, trzema różnymi "następnymi" wskaźnikami nazywanymi takimi jak "nezt", "w poprzek" i "w dół") .
Nie chcę listy węzłów wskazujących na elementy, chcę listę elementów, które są węzłami (tj. Mają następne pole).
Dzięki, ale myślę, że źle skierowałem cię na mój przykład. Zobacz moją edycję na pytanie: –
@Paul - Myślę, że istnieje lepszy sposób na osiągnięcie tego, co chcesz (zobacz moją zmodyfikowaną odpowiedź). –
Hmm. Implicyjne konwersje brzmią obiecująco. Pozwól mi odejść i zastanowić się trochę ... –