Есть ли очередь фиксированного размера, которая удаляет лишние элементы? - PullRequest
110 голосов
/ 26 декабря 2009

Мне нужна очередь с фиксированным размером. Когда я добавляю элемент и очередь заполнена, он должен автоматически удалить самый старый элемент.

Существует ли существующая реализация для этого в Java?

Ответы [ 14 ]

0 голосов
/ 26 июля 2012

На самом деле вы можете написать свой собственный impl на основе LinkedList, это довольно просто, просто переопределите метод add и сделайте персонал.

0 голосов
/ 26 декабря 2009

Не совсем понятно, какие у вас требования заставили вас задать этот вопрос. Если вам нужна структура данных фиксированного размера, вы можете также рассмотреть различные политики кэширования. Тем не менее, поскольку у вас есть очередь, я думаю, вы ищете какой-то тип функциональности маршрутизатора. В этом случае я бы использовал кольцевой буфер: массив с первым и последним индексом. Всякий раз, когда элемент добавляется, вы просто увеличиваете индекс последнего элемента, а когда элемент удаляется, увеличиваете индекс первого элемента. В обоих случаях сложение выполняется по модулю размера массива, и обязательно увеличивайте другой индекс при необходимости, то есть когда очередь заполнена или пуста.

Кроме того, если это приложение типа маршрутизатора, вы также можете поэкспериментировать с таким алгоритмом, как Random Early Dropping (RED), который случайным образом удаляет элементы из очереди даже до ее заполнения. В некоторых случаях было установлено, что RED имеет лучшую общую производительность, чем простой метод, позволяющий заполнить очередь перед сбросом.

0 голосов
/ 26 декабря 2009

Также см. этот вопрос SO или ArrayBlockingQueue (будьте осторожны с блокировкой, это может быть нежелательно в вашем случае).

0 голосов
/ 26 декабря 2009

Похоже на обычный список, в котором метод add содержит дополнительный фрагмент, который усекает список, если он становится слишком длинным.

Если это слишком просто, вам, вероятно, нужно отредактировать описание проблемы.

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