001package org.syncany.util;
002
003import java.util.Collection;
004import java.util.TreeSet;
005
006/**
007 * A limited sorted set is a {@link TreeSet} with limited entries.
008 * Entries that exceed the maximum size of the set (<em>maxSize</em>) 
009 * will be removed from the set. 
010 * 
011 * @see <a href="http://stackoverflow.com/questions/8382529/limited-sortedset">Original code on stackoverflow.com</a>
012 * @author Thomas ?, see http://stackoverflow.com/users/637853/thomas
013 */
014@SuppressWarnings("unchecked")
015public class LimitedSortedSet<E> extends TreeSet<E> {
016        private static final long serialVersionUID = -4876601911765911284L;
017        private int maxSize;
018
019        public LimitedSortedSet(int maxSize) {
020                this.maxSize = maxSize;
021        }
022
023        @Override
024        public boolean addAll(Collection<? extends E> c) {
025                boolean added = super.addAll(c);
026                
027                if (size() > maxSize) {                 
028                        E firstToRemove = (E) toArray()[maxSize];
029                        removeAll(tailSet(firstToRemove));
030                }
031                
032                return added;
033        }
034
035        @Override
036        public boolean add(E o) {
037                boolean added = super.add(o);
038                
039                if (size() > maxSize) {
040                        E firstToRemove = (E) toArray()[maxSize];
041                        removeAll(tailSet(firstToRemove));
042                }
043                
044                return added;
045        }
046}