我想维护一个名为' 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作为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,但降序迭代器不允许你添加/删除条目。我试图计算索引,但然后设置(索引,值)替换现有的条目。如何在列表中插入条目?
======================修订版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;
}
}
);
}
我比较id只有一个客户端ID在列表中不能有多个条目,但是两个不同的客户端可以具有相同的时间值。此代码似乎不起作用,添加工作正常,但如果我无法仅基于clientid删除条目。
答案 0 :(得分:0)
我认为您要找的类型是SortedSet
,可以TreeSet
实现。
有序集使用compare(...)
实现对表中的所有条目进行排序。
集合中的所有元素都必须实现Comparator<T>
接口才能使SortedSet正常工作。
您可能更喜欢使用以类似方式工作的SortedMap
。您可以将客户端ID设置为值,将时间字段设置为键,地图将使用时间字段比较来保持排序。
你也在谈论竞争条件。使用TreeMap的javadoc讨论了这一点,并提到必须使用Collections.synchronizedSortedMap(...)
在外部同步地图。
我还没有尝试过同步实施,所以我无法添加更多内容。
查看文档以获取更多信息:
http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html http://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html
答案 1 :(得分:0)
我希望每个新条目都有时间&gt; =列表中的最后一个条目 但是有可能出现竞争条件,我可能会离开 订单价值。所以我想从最后遍历列表 将是最省时的解决方案。
如果您有可能进行并发访问,则必须同步LinkedList的迭代和变异。你不会只是不按顺序获取项目,最好的情况是迭代导致ConcurrentModificationException,最坏的情况是不确定的数据丢失。