lacolaco
3/4/2013 - 3:54 PM

SortedListとかいうのがTLに見えたから

SortedListとかいうのがTLに見えたから

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.RandomAccess;

public class SortedList<E> extends ArrayList<E>
{

  private Sorter<E> sorter;

	public SortedList(Sorter<E> sorter, int initialCapacity)
	{
		super(initialCapacity);
		this.sorter = sorter;
	}

	public SortedList(Sorter<E> sorter)
	{
		super();
		this.sorter = sorter;
	}

	public SortedList(Sorter<E> sorter, Collection<? extends E> c)
	{
		super(c);
		this.sorter = sorter;
	}

	@Override
	public boolean add(E e)
	{
		boolean b = super.add(e);
		if (b)
		{
			sort();
		}
		return b;
	}

	@Override
	public void add(int index, E element)
	{
		super.add(index, element);
		sort();
	}

	@Override
	public boolean addAll(Collection<? extends E> c)
	{
		boolean b = super.addAll(c);
		if (b)
		{
			sort();
		}
		return b;
	}

	@Override
	public boolean addAll(int index, Collection<? extends E> c)
	{
		boolean b = super.addAll(index, c);
		if (b)
		{
			sort();
		}
		return b;
	}

	@Override
	public E remove(int index)
	{
		E e = super.remove(index);
		sort();
		return e;
	}

	@Override
	public boolean remove(Object o)
	{
		boolean b = super.remove(o);
		if (b)
		{
			sort();
		}
		return b;
	}

	@Override
	public E set(int index, E element)
	{
		E e = super.set(index, element);
		sort();
		return e;
	}

	public synchronized List<E> sort()
	{
		return sorter.sort(this);
	}

	public static abstract class Sorter<E>
	{

		public abstract List sort(List<E> list);

	}
}