Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Rotating queue of fixed size

/*  *  Copyright 2009 Ancora Research Group.  *   *  Licensed under the Apache License, Version 2.0 (the "License");  *  you may not use this file except in compliance with the License.  *  You may obtain a copy of the License at  *   *       http://www.apache.org/licenses/LICENSE-2.0  *   *  Unless required by applicable law or agreed to in writing, software  *  distributed under the License is distributed on an "AS IS" BASIS,  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  *  See the License for the specific language governing permissions and  *  limitations under the License.  *  under the License.  */ //package org.ancora.SharedLibrary.DataStructures; import java.util.ArrayList; import java.util.List; /**  * Rotating queue of fixed size.  *  * @author Joao Bispo  */ public class RotatingQueue<T> {    public RotatingQueue(int capacity) {       size = capacity;       queue = new ArrayList<T>(capacity);       mostRecentItem = capacity-1;    }    /**     * Inserts an element to the head of the queue, pushing all other elements     * one position forward.     *     * @param element     */    public void insertElement(T element) {       //Get index       mostRecentItem = advancePointer(mostRecentItem);       //Check if list already has an element       if(queue.size() == mostRecentItem ) {          queue.add(element);       } else {          queue.set(mostRecentItem, element);       }    }    public T getElement(int index) {       // Normalize index to size of queue       index = index % size;       // Translate wanted index to queue index       int queueIndex = mostRecentItem - index;       // If negative, add size       if(queueIndex < 0) {          queueIndex += size;       }       // Check if element already exists in queue       if(queueIndex < queue.size()) {          return queue.get(queueIndex);       } else {          return null;       }    }    public int size() {       return size;    }    private int advancePointer(int oldPointer) {       int pointer = oldPointer+1;       if(pointer < size) {          return pointer;       } else {          return 0;       }    }    ///    // INSTANCE VARIABLES    ///    private List<T> queue;    private int mostRecentItem;    private int size; }