Как мне реализовать List фиксированного размера в Scala? - PullRequest
5 голосов
/ 15 августа 2011

Например, предположим, я хочу список, который содержит от 0 до максимум 1000 элементов. Выше этого, самые старые вставки должны быть удалены в первую очередь. Поддерживают ли коллекции эту функцию изначально? Если нет, то как бы я пошел о реализации? Я понимаю, что некоторые операции над списками выполняются очень медленно, поэтому, возможно, мне нужен другой тип данных?

Просмотр элемента не должен влиять на список. Я хотел бы только операции вставки и размера.

Ответы [ 4 ]

9 голосов
/ 21 сентября 2011

Вот моя первая реализация, в случае, если кто-то найдет ее полезной

import scala.collection._
import mutable.ListBuffer

class FixedList[A](max: Int) extends Traversable[A] {

  val list: ListBuffer[A] = ListBuffer()

  def append(elem: A) {
    if (list.size == max) {
      list.trimStart(1)
    }
    list.append(elem)
  }

  def foreach[U](f: A => U) = list.foreach(f)

}
7 голосов
/ 15 августа 2011

Звучит так, будто вы хотите ограниченную по размеру очередь. Вот похожий вопрос: Максимальная длина очереди scala

В этом вопросе представлены три решения. Вы можете,

  1. Написать очередь с нуля (парадигматический код дал для этого),
  2. Расширить реализацию Scala Queue путем создания подклассов, или
  3. Используйте шаблон расширения класса типов (aka, "pimp my library"), чтобы расширить Queue.
1 голос
/ 16 августа 2011

Круговой массив - самая быстрая реализация. В основном это массив с индексом чтения и записи, который оборачивается при достижении конца массива. Размер определяется как:

def size = writeIndex - readIndex + (if (readIndex > writeIndex) array.size else 0)
0 голосов
/ 30 апреля 2019

Хотя это и не ответ на детали вопроса (но в некоторой степени отвечает на заголовок вопроса), List.fill(1000){0} создаст List длины 1000 с начальным значением 0, то есть от

Scala - создание параметризованного массива типа указанной длины

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...