Я хочу вести список объектов с именем «ClientStatus», которые не содержат ничего, кроме идентификации клиента (id) и некоторого поля времени, т.е. связанного с этим клиентом. Этот список должен быть отсортирован по этому полю времени в порядке возрастания. Операции, которые я хочу поддержать:
* peek and remove an entry from the beginning
* Search the list for an entry and if found, remove it
* Add an entry to this list
Я ожидаю, что каждая новая запись будет иметь время >= последней записи в списке, но есть вероятность состояния гонки, когда я могу выйти из строя значений порядка. Поэтому я решил, что итерация по списку с конца будет наиболее эффективным решением с точки зрения времени.
Это DS, которые я использовал:
LinkedList и ListIterator as ListIterator позволяют перебирать элементы с конца и добавлять новые записи во время итерации. Но код выглядит грязно:
Скажем, в моем списке есть значения: 2 3 6 7 9, и я хочу добавить 5
ListIterator<Integer> it = list.listIterator(list.size()); while (it.hasPrevious()) { if (it.previous().intValue() <= 5) { it.next(); break; } }
Есть лучший способ сделать это?
Я также пытался использовать LinkedList и Dequeue, но итератор по убыванию не позволяет добавлять/удалять записи. Я пытался подсчитать индексы, но затем set(index, value) заменяет существующую запись. Как вставить запись в список?
====================== Редакция 2 ========================== ==
В соответствии с консенсусом я решил использовать SortedSet, я был бы признателен, если бы написанный мной код можно было проверить на предмет технических аспектов согласованности между Comparator и equals.
private static class ClientStatus {
public long id;
public long time;
public ClientStatus(final long id, final long time) {
this.id = id;
this.time = time;
}
@Override
public boolean equals(final Object o) {
if ((o == null) || (getClass() != o.getClass())) {
return false;
}
if (this == o) {
return true;
}
ClientStatus obj = (ClientStatus) o;
return this.id == obj.id;
}
}
public static void main(String[] args) {
SortedSet<ClientStatus> active_client_set = new TreeSet<ClientStatus>(
new Comparator<ClientStatus>() {
@Override
public int compare(final ClientStatus o1, final ClientStatus o2) {
if (o1.getClass() != o2.getClass()) {
return -1;
}
if (o1 == o2 || o1.id == o2.id) {
return 0;
}
return (o1.time - o2.time) < 0 ? -1 : +1;
}
}
);
}
Я сравниваю идентификатор только с одним идентификатором клиента, который не может иметь несколько записей в списке, но два разных клиента могут иметь одинаковое значение времени. Этот код не работает, добавление работает нормально, но если я не могу удалить запись только на основе идентификатора клиента.
SortedSet
может быть выходом. Но если вы хотите использоватьLinkedList
, вы, кажется, на правильном пути, подсчитывая индексы, но используйте методadd
, который вставит новую запись в список. См.LinkedList
javadoc. - person ajb   schedule 18.06.2014