繁体   English   中英

Java - 数据结构设计 - 固定大小、随机访问、线程安全、有序集合

[英]Java - Data structure design - Fixed size, random access, thread safe, sorted collection

因此,在某些问题中,我需要实现以下内容:固定大小的数据结构(n=10),始终是有序的(降序,无关紧要),线程安全,并支持随机访问。

我的解决方案是 - 使用TreeSet ,每当添加一个元素时,如果已经有n元素,则删除最小的元素(如果新元素大于它)并添加新元素。 否则,只需添加新元素。 访问随机索引时,使用TreeSet迭代器迭代直到需要的索引。

我不太喜欢这个解决方案。 所以我想到了另一种解决方案:使用大小为nArrayList 每当尝试添加元素时,对元素执行Collections.binarySearch()并使用从 binarySearch 返回的索引插入它(如果它不存在)。 如果添加元素后列表长度大于n (实际上等于n+1 ),则删除最小的元素(位于列表末尾)。 这样,我们得到了用于添加的 log(n)(与之前解决方案中的TreeSet相同)并且随机访问是 O(1)。 我唯一不喜欢的是,列表中间任意索引的add()需要移动它之后的所有元素。 (对于小n效果很好,但对于大 n 可能不行?)

对于这两种解决方案,我都使用ReentrantReadWriteLock - 获取 writeLock() 用于 add 和 readLock() 用于 get() / read 操作。

有更好的解决方案吗?

**

Collections.synchronizedList(List i)使传递的参数成为线程安全列表。

您可以在创建 class 并覆盖 compareTo() 方法时实现可比较的接口,当您将元素添加到 ArrayList<>() 时,它会按降序对元素进行排序,或者您可以 go 用于比较器 ZA2F2ED4F8EBC2ABC1DDC4 和) 方法同时对其进行排序。

在全部集合中,只有 List(I) 支持 RandomAccess。

ArrayList<Employee> arrayList = Collections.synchronizedCollection(new ArrayList<Employee>(10));

如果您不希望将相同的项目添加到 ArrayList 中,请使用比较器并在新项目(要添加)和最后一个项目(已添加)相等时返回 0。 以 if (...==0){ don't add to the data ) else { add it } 的方式处理返回值。 我希望我能给你一些提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM