То, что я сделал, это реализовать 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);
}
Если вы хотите избежать вложений, вы также можете исключить и исключить операцию неподдерживаемой операции в методах «добавить» и «установить».
public boolean add(Contact object) {
throw new UnsupportedOperationException("Use putOrdered instead");
}
... а также вы должны быть осторожны с методами ListIterator, потому что они могут изменить ваш внутренний список. В этом случае вы можете вернуть копию внутреннего списка или снова выбросить исключение.
public ListIterator<Contact> listIterator() {
return (new ArrayList<Contact>(list)).listIterator();
}