Структура данных фиксированного размера в Java - PullRequest
0 голосов
/ 01 апреля 2011

Мне нужна структура данных (многопоточная среда) в Java, которая может содержать до 'n' элементов.Если я добавлю (n + 1) -й элемент, то я должен заменить самый старый элемент этим новым элементом.Я знаю, что могу сделать это, проверив размер в каждом add () и выполнив операцию замены в полном размере.Но я хотел бы знать, есть ли какая-либо структура данных в библиотеке Java для этого.Пожалуйста, помогите

Ответы [ 3 ]

3 голосов
/ 01 апреля 2011

Попробуйте использовать массив фиксированного размера и добавьте с помощью индекса по модулю размера. Это известно как круговой массив, Википедия имеет достойную статью на эту тему.

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

Примерно так:

Object[] ring = new Object[32];
int writeIndex = 0;

public void add(Object o) {
  ring[writeIndex % ring.length] = o;
  writeIndex++;
}
2 голосов
/ 01 апреля 2011

Один из способов сделать это, в зависимости от ваших потребностей, - обернуть подкласс LinkedHashMap.

import java.util.AbstractSet;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class FixedSizeSet<E> extends AbstractSet<E> {
    private final LinkedHashMap<E, E> contents;

    FixedSizeSet(final int maxCapacity) {
        contents = new LinkedHashMap<E, E>(maxCapacity * 4 /3, 0.75f, false) {
            @Override
            protected boolean removeEldestEntry(java.util.Map.Entry<E, E> eldest) {
                return size() == maxCapacity;
            }
        };      
    }

    @Override
    public Iterator<E> iterator() {
        return contents.keySet().iterator();
    }

    @Override
    public int size() {
        return contents.size();
    }

    public boolean add(E e) {
        boolean hadNull = false;
        if (e == null) {
            hadNull = contents.containsKey(null);
        }
        E previous = contents.put(e, e);
        return e == null ? hadNull : previous != null;
    }

    @Override
    public boolean contains(Object o) {
        return contents.containsKey(o);
    }
}
2 голосов
/ 01 апреля 2011

это круговая очередь, и для этого не существует нативного класса java. Вы можете посмотреть на ArrayCircularQueue .

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