package org.limewire.collection;
import java.util.Collection;
import java.util.Comparator;
/**
* Gives a sorted list of elements with a maximum size. Elements are sorted
* upon insertion to the list, but only a fixed number of items are allowed.
* Therefore, if the list has reached the capacity, the last ordered element
* is removed and then the new element is inserted in the proper location.
*
<pre>
FixedSizeSortedList<String> fssl = new FixedSizeSortedList<String>(5);
fssl.add("Abby");
fssl.add("Abby");
fssl.add("Bob");
fssl.add("Chris");
fssl.add("Dan");
System.out.println(fssl);
fssl.add("Eric");
System.out.println(fssl);
fssl.add("Abby");
System.out.println(fssl);
Output:
[Abby, Abby, Bob, Chris, Dan]
[Abby, Abby, Bob, Chris, Eric]
[Abby, Abby, Abby, Bob, Chris]
</pre>
*/
public class FixedSizeSortedList<E> extends SortedList<E> {
private final int capacity;
public FixedSizeSortedList(int capacity) {
this.capacity = capacity;
}
public FixedSizeSortedList(Collection<? extends E> c, Comparator<? super E> comparator, int capacity) {
super(c, comparator);
this.capacity = capacity;
}
public FixedSizeSortedList(Collection<? extends E> c, int capacity) {
super(c);
this.capacity = capacity;
}
public FixedSizeSortedList(Comparator<? super E> comparator, int capacity) {
super(comparator);
this.capacity = capacity;
}
@Override
public boolean add(E e) {
if (size() == capacity)
remove(last());
return super.add(e);
}
/**
* Tries to insert an element into the list. This may fail if the list is
* full and the new element is ordered below all existing elements, in
* which case the new element is returned. If the list is full and the new
* element is ordered above any existing element, the new element is
* inserted and the lowest-ordered element is removed and returned. If the
* list is not full, the new element is inserted and null is returned.
*
* @return null, the new element, or an existing element that was removed
*/
public E insert(E e) {
E ret = null;
if (size() == capacity) {
ret = last();
if (comparator().compare(e, ret) < 0)
return e;
remove(ret);
}
add(e);
return ret;
}
}