2015-09-30 2 views
0

В Scala, что является лучшим способом добавить элемент в список, убедившись, что в списке всегда содержатся последние n элементов.Как добавить элемент в Список, убедившись, что список содержит последние n элементов в scala

Так что если список (1, 2, 3, 4, 5) и n = 5, то добавление 6 должно приводить к (2, 3, 4, 5, 6).

Одним из возможных путей может быть:

list = list ::: List(6) 
list = list.takeRight(5) 

Есть ли более эффективные способы? Кроме того, существует ли лучшая структура данных для поддержания такой часто меняющейся коллекции?

+0

возможно дубликат [Лучшая практика для сдвига последовательности круговым способом] (http://stackoverflow.com/questions/8876769/best-practice -for-shift-a-sequence-in-a-circle-way) –

ответ

1

Похоже, что фиксированный размер Circular Buffer удовлетворит ваши потребности. Я думаю, что apache commons обеспечивает некоторую реализацию.

Раствор в Скале с помощью List может быть:

scala> def dropHeadAndAddToList[T](obj: T, list: List[T]):List[T] = { 
      list.drop(1) :+ obj 
     } 

     dropHeadAndAddToList: [T](obj: T, list: List[T])List[T] 

scala> val a = List(1,2,3,4,5) 
a: List[Int] = List(1, 2, 3, 4, 5) 

scala> dropHeadAndAddToList(6, a) 
res0: List[Int] = List(2, 3, 4, 5, 6) 
+0

Imo, «addToList» не похож на хорошее имя для функции, которая удаляет элемент из списка :) На самом деле просто «myList. drop (1): + 6 "выглядит не так уж плохо. – psisoyev

+0

Вы правы, называть вещи тяжело, и мой ответ был ленив в этом отношении! Я отредактирую его до лучшего имени :) – rahilb

+0

как list.drop (1) сравнивается с list.takeRight (n) с точки зрения производительности? –

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