Что я сделал, так это реализовал List, имеющий внутренний экземпляр со всеми делегированными методами.
public class ContactList implements List<Contact>, Serializable {
private static final long serialVersionUID = -1862666454644475565L;
private final List<Contact> list;
public ContactList() {
super();
this.list = new ArrayList<Contact>();
}
public ContactList(List<Contact> list) {
super();
//copy and order list
List<Contact>aux= new ArrayList(list);
Collections.sort(aux);
this.list = aux;
}
public void clear() {
list.clear();
}
public boolean contains(Object object) {
return list.contains(object);
}
После этого я реализовал новый метод "putOrdered", который вставляет в правильное положение, если элемент не существует, или заменяет его, если он существует.
public void putOrdered(Contact contact) {
int index=Collections.binarySearch(this.list,contact);
if(index<0){
index= -(index+1);
list.add(index, contact);
}else{
list.set(index, contact);
}
}
Если вы хотите разрешить повторяющиеся элементы, просто используйте вместо них addOrdered (или оба).
public void addOrdered(Contact contact) {
int index=Collections.binarySearch(this.list,contact);
if(index<0){
index= -(index+1);
}
list.add(index, contact);
}
Если вы хотите избежать вставок, вы также можете вызвать исключение и неподдерживаемую операцию для методов «add» и «set».
public boolean add(Contact object) {
throw new UnsupportedOperationException("Use putOrdered instead");
}
... а также Вы должны быть осторожны с методами ListIterator, потому что они могут изменить ваш внутренний список. В этом случае вы можете вернуть копию внутреннего списка или снова выдать исключение.
public ListIterator<Contact> listIterator() {
return (new ArrayList<Contact>(list)).listIterator();
}