![](/img/trans.png)
[英]Is there a Java data structure that is thread-safe for parallel threads writing to different parts of an array of fixed size?
[英]Java - Data structure design - Fixed size, random access, thread safe, sorted collection
因此,在某些问题中,我需要实现以下内容:固定大小的数据结构(n=10),始终是有序的(降序,无关紧要),线程安全,并支持随机访问。
我的解决方案是 - 使用TreeSet
,每当添加一个元素时,如果已经有n
元素,则删除最小的元素(如果新元素大于它)并添加新元素。 否则,只需添加新元素。 访问随机索引时,使用TreeSet
迭代器迭代直到需要的索引。
我不太喜欢这个解决方案。 所以我想到了另一种解决方案:使用大小为n
的ArrayList
。 每当尝试添加元素时,对元素执行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.