2013-04-10 2 views
0

Я делаю курс scala и в одном задании хочу добавить к концу пользовательский список.Добавление к концу пользовательского списка

trait EntityList { 
    def head: Entity 
    def tail: EntityList 
    def isEmpty: Boolean 
} 

object Nil extends EntityList { 
    def head = throw new java.util.NoSuchElementException("head of EmptyList") 
    def tail = throw new java.util.NoSuchElementException("tail of EmptyList") 
    def isEmpty = true 
} 

class Cons(val head: Entity, val tail: EntityList) extends EntityList { 
    def isEmpty = false 
} 

Я могу добавить создать новый элемент в начало списка и создать новый список, выполнив:

new Cons(myNewElement, myExistingList) 

но как создать новый список с новым элементом, добавив к конец пользовательского списка?

ответ

4

Для «запаса» (стандартная библиотека) List

val l1 = List(1, 2, 3) 
l1: List[Int] = List(1, 2, 3) 

val l2 = l1 :+ 4 
l2: List[Int] = List(1, 2, 3, 4) 

val l3 = l2 ++ List(5, 6, 7, 8) 
l3: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8) 

Однако, вы должны тщательно рассмотреть последствия пытаются добавить новые элементы в конце списка против клеток, таких как List (и ваш «пользовательский» список), так как это очень неэффективно. Часто, когда вам нужен этот результат, вы пишете рекурсивный алгоритм, который дает список, который вы хотите в обратном порядке («потому что вы делаете эффективную вещь и добавляете вновь созданные элементы в голову накопительного списка), а затем, когда все это делается, отмените назад, чтобы получить правильную последовательность.

Для вашего списка «Custom»

Для элементарного списка против клеток ни с одним из тонкостей в Scala List, можно построить только с фронта. В этом случае создайте список, добавив новые элементы на передний план (единственное, что вы можете сделать), затем напишите алгоритм reverse, чтобы получить список в нужной последовательности.

Добавление

Я предполагаю, что я на самом деле не ответить на этот вопрос. Если ваша цель/требование состоит в том, чтобы добавить новый элемент в конец, то вам нужно создать новый список, содержащий только этот элемент, и один за другим (рекурсивно) добавить каждый элемент существующего списка от последнего к первому! В идеале вы сделали бы это с помощью рекурсивной реализации. Если вы не понимаете неэффективность добавления перед тем, как начать, вы это сделаете.

Смежные вопросы