Гибрид между функциями очередей и типов карт - PullRequest
0 голосов
/ 22 марта 2011

Я понимаю, что очередь - это тип коллекции, доступ к которому осуществляется через голову и / или хвост.

Я также понимаю, что карта - это тип коллекции, содержащий ряд уникальных ключей, каждый из которых имеет соответствующее значение.

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

Трудная часть, которую я не могу понять - заставить значения выступать в качестве очереди фиксированной длины, которую можно нажимать, не затрагивая клавишу.

Например:

Начальная коллекция (самые новые предметы вверху):

Key1, Value1
Key2, Value2
Key3, Value3

Коллекция после добавления нового значения NewValue:

Key1, NewValue
Key2, Value1
Key3, Value2

Итак, я хочу, чтобы ключ остался прежним, и чтобы я мог добавить новое значение, сдвинув самое старое значение с конца и переместив все остальные значения дальше вниз к концу.

Если такой тип не доступен в рамках, кто-то может порекомендовать способ его реализации.

Спасибо!

EDIT: Пример того, почему мне нужно это сделать:

Мне нужно иметь доступ к значениям в соответствии с периодом времени это было создано в.
Пример: * 1 027 *

Ключ: 0 будет содержать значение с сегодняшнего дня
Ключ: -1 будет содержать значение со вчерашнего дня
Ключ: -2 будет содержать значение двух дней назад
и т. д.

Будет вводиться только одно значение день, и одно значение всегда будет вводится каждый день.

Ответы [ 3 ]

3 голосов
/ 22 марта 2011

Звучит так, как вы могли бы использовать:

new LinkedHashMap<Long,V>(initialCapacity, loadFactor, false) {
    protected boolean removeEldestEntry(Map.Entry<Long,V> e) {
        return size() > MAX_ENTRIES;
    }
};

Чтобы получить или поместить предметы на эту карту, вам необходимо канонизировать вашу временную метку, например, до 00: 00: 00.000 дня.

Преимущество этого подхода состоит в том, что, когда допущение, что «ВСЕГДА будет вводиться одно значение каждый день» нарушается, оно молча не подведет.

1 голос
/ 22 марта 2011

Итак, вы действительно говорите об индексе в массиве.

Я бы просто обернул ArrayList в вашем объекте.

Ваш метод push также удалит «самый старый» элемент с конца. Вы бы определили методы, такие как getToday() и getPriorDay(numDaysBackFromToday)

Однако вы используете там много магических чисел, если вы на самом деле не храните дату или время с данными. Вы надеетесь , что данные были загружены правильно.

Лично я бы использовал временную метку, связанную с данными в LinkedHashMap, и выполнял бы итерацию, чтобы найти ту, которая вам нужна.

0 голосов
/ 22 марта 2011

Я переосмыслил свой вопрос относительно магических чисел и решил, что будет проще использовать предопределенный тип коллекции с положительными индексами.Затем я просто заставлю метод push сбросить последний элемент с конца, когда достигну максимального количества значений, которое мне нужно.

Затем я заставлю свой класс интерпретировать -1 как 1, чтобы получить требуемыйзначение.

Спасибо за вашу помощь, я просто обдумывал вещи.

...