如何维护一个Ordered Linked List并在java中添加,删除元素

时间:2014-06-17 21:24:19

标签: java linked-list iterator listiterator

我想维护一个名为' 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删除条目。

2 个答案:

答案 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,最坏的情况是不确定的数据丢失。