Опять же, это кажется чем-то очевидным.
Я хотел бы вставить элемент в связанный список в определенной позиции.
В одном случае, это когда поле в элементе меньше определенного значения, поэтому я могу сделать это следующим образом:
def Add(act:Elem):Unit = {
val (before, after) = myList.partition(elem.n >= _.n)
myList = (before :+ act) ++ after
}
... но это действительно неизменный подход, замаскированный под изменчивый. Я не думаю, что смогу добраться до узла LinkedList, который соответствует точке вставки, поэтому я не могу связываться с атрибутом «next».
Это не должно быть так сложно. Половина связанных списков состоит в том, что вы вставляете объекты посередине.
Я все еще работаю с генератором компилятора (как в этот вопрос ). Замена списков на копии просто не способ сделать это, так как существует много рекурсивных вызовов, во время которых списки изменяются преднамеренно, поэтому вы можете обнаружить, что некоторые из рекурсивных вызовов все еще используют списки, которые вы только что заменили.
Мне действительно нужны изменяемые списки и простые изменяемые операции. Я думаю, что могу написать свои собственные классы коллекций, но я не думаю, что это настолько необычно. Кто-нибудь уже реализовал "правильные" мультистабильные связанные списки?
EDIT
Немного подробнее
Возможно, я должен был выбрать другой пример. Как правило, у меня есть ссылка на элемент по какому-либо другому маршруту, и я хочу вставить новый элемент в один из связанных списков, в котором этот элемент включен (я был бы рад, если бы этот элемент был в одном связанном списке как старт)
В простой реализации Java, с которой я начинаю, сам элемент содержит поле next
(которым я затем могу манипулировать).
В случае Scala LinkedList узел связанного списка содержит ссылку на элемент, и поэтому, учитывая элемент, я не могу легко найти узел LinkedList и, следовательно, следующее поле.
Я снова могу просмотреть список, но он может быть очень длинным.
Это может помочь предположить DoublyLinkedList и удалить элемент в качестве операции, которую я хочу сделать, поскольку более ясно, что обход не требуется, и поэтому его следует избегать. Так что в этом случае, предположим, что я нашел элемент другими способами, чем обход связанного списка. Теперь я хочу удалить элемент. В случае Java / naive указатели назад и вперед являются частью элемента. В случае коллекций Scala где-то есть узел DoublyLinkedList, который содержит ссылку на мой элемент. Но я не могу перейти от элемента к этому узлу без повторного обхода списка.
Случайные мысли следуют: я добираюсь куда-то, смешивая в Черте, которая определяет следующее поле (для моего единственно связанного случая). Эта черта может поддерживать, например, перебор объектов в списке. Но это помогло бы мне только для элементов, которые находятся в одном списке за раз, и у меня есть объекты, которые находятся на трех (с, в настоящее время, тремя различными указателями «следующий», называемыми такими вещами, как «nezt», «поперек» и «вниз») .
Мне не нужен список узлов, указывающих на элементы, я хочу список элементов, которые являются узлами (т.е. имеют следующее поле).