Хотя это может сработать, это далеко не лучший опыт.
От SortedSet docs:
Обратите внимание, что заказ поддерживается отсортированный набор (предоставляется ли или нет явного компаратора) должны быть совместимы с равными, если отсортированный набор правильно реализовать Установите интерфейс. (См. Интерфейс Comparable или интерфейс Comparator для точного определения соответствия с равными.) Это связано с тем, что интерфейс Set определяется в терминах операции равенства, но сортированный набор выполняет все сравнения элементов с помощью метода compareTo (или сравнения) , поэтому два элемента, которые считаются равными этому методу, равны, с точки зрения сортированного множества. Поведение сортированного множества хорошо определено, даже если его упорядочение не соответствует равным; он просто не подчиняется генеральному контракту интерфейса Set.
Для объектов, которые реализуют Comparable
, всегда должно быть соответствие между методами equals()
, hashcode()
и compareTo()
.
Боюсь SortedSet
это просто не то, что вы хотите, и не будет гуавы MultiSet
быть адекватной (потому что он не позволит вам самостоятельно получить несколько одинаковых элементов). Я думаю, что вам нужен SortedList
. Нет такого зверя, которого я знаю (возможно, в коллекциях коллекций, но это немного на стороне наследства), поэтому я применил один из них, используя Guasta ForwardingList в качестве базового класса. Вкратце: этот список делегирует почти все на ArrayList
, который он использует внутренне, но использует Collections.binarySearch()
в своем методе add()
, чтобы найти правильное положение вставки, и он генерирует UnsupportedOperationException
по всем необязательным методам интерфейсов и ListIterator
, которые добавляют или устанавливают значения в данной позиции.
Конструкторы идентичны конструкциям ArrayList
, но для каждой из них имеется также вторая версия с пользовательским номером Comparator
. Если вы не используете пользовательский Компаратор, элементы списка должны реализовать. Comparable
или RuntimeException
s будут возникать при сортировке.
public class SortedArrayList<E> extends ForwardingList<E> implements
RandomAccess{
private final class ListIteratorImpl extends ForwardingListIterator<E>{
private final int start;
public ListIteratorImpl(final int start){
this.start = start;
}
@Override
public void set(E element){throw new UnsupportedOperationException();}
@Override
public void add(E element){throw new UnsupportedOperationException();}
@Override
protected ListIterator<E> delegate(){return inner.listIterator(start);};
}
private Comparator<? super E> comparator;
private List<E> inner;
public SortedArrayList(){this(null, null, null);}
@SuppressWarnings("unchecked")
private SortedArrayList(
final List<E> existing,
final Collection<? extends E> values,
final Comparator<? super E> comparator
){
this.comparator =
(Comparator<? super E>)
(comparator == null
? Ordering.natural()
: comparator );
inner = (
existing == null
? (values == null
? new ArrayList<E>(values)
: new ArrayList<E>()
)
: existing;
}
public SortedArrayList(final Collection<? extends E> c){
this(null, c, null);
}
public SortedArrayList(final Collection<? extends E> c,
final Comparator<? super E> comparator){
this(null, c, comparator);
}
public SortedArrayList(final Comparator<? super E> comparator){
this(null, null, comparator);
}
public SortedArrayList(final int initialCapacity){
this(new ArrayList<E>(initialCapacity), null, null);
}
public SortedArrayList(final int initialCapacity,
final Comparator<? super E> comparator){
this(new ArrayList<E>(initialCapacity), null, comparator);
}
@Override
public boolean add(final E e){
inner.add(
Math.abs(
Collections.binarySearch(inner, e, comparator)
) + 1,
e
);
return true;
}
@Override
public void add(int i, E e){throw new UnsupportedOperationException();}
@Override
public boolean addAll(final Collection<? extends E> collection){
return standardAddAll(collection);
}
@Override
public boolean addAll(int i,
Collection<? extends E> es){
throw new UnsupportedOperationException();
}
@Override
protected List<E> delegate(){ return inner; }
@Override
public List<E> subList(final int fromIndex, final int toIndex){
return new SortedArrayList<E>(
inner.subList(fromIndex, toIndex),
null,
comparator
);
}
@Override
public ListIterator<E> listIterator(){ return new ListIteratorImpl(0); }
@Override
public ListIterator<E> listIterator(final int index){
return new ListIteratorImpl(index);
}
@Override
public E set(int i, E e){ throw new UnsupportedOperationException(); }
}
Итак, вы хотите написать свой собственный компаратор для упорядочивания структуры в своем дереве? – 2010-12-03 09:50:11
@ The Elite Gentleman, да. – 2010-12-03 09:53:06
один из этих возвратов после `strictliBigger` должен быть -1 – 2010-12-03 10:16:46