Java-数据结构设计-固定大小、随机访问、线程安全、分类收集
因此,在某些问题上,我被要求实施以下措施: 固定大小(n=10)的数据结构,总是有序的(降序,不重要),线程安全,支持随机访问 我的解决方案是-使用Java-数据结构设计-固定大小、随机访问、线程安全、分类收集,java,sorting,data-structures,collections,Java,Sorting,Data Structures,Collections,因此,在某些问题上,我被要求实施以下措施: 固定大小(n=10)的数据结构,总是有序的(降序,不重要),线程安全,支持随机访问 我的解决方案是-使用树集,每当添加元素时,如果已经有n个元素,移除最小的元素(如果新元素大于它),然后添加新元素。否则,只需添加新元素。 访问随机索引时,使用TreeSet迭代器进行迭代,直到达到所需的索引 我不太喜欢这个解决方案。所以我想到了另一个解决方案: 使用大小为n的ArrayList。每当尝试添加元素时,对该元素执行Collections.binarySear
树集
,每当添加元素时,如果已经有n个
元素,移除最小的元素(如果新元素大于它),然后添加新元素。否则,只需添加新元素。
访问随机索引时,使用
TreeSet
迭代器进行迭代,直到达到所需的索引
我不太喜欢这个解决方案。所以我想到了另一个解决方案:
使用大小为n
的ArrayList
。每当尝试添加元素时,对该元素执行Collections.binarySearch()
,如果该元素不存在,则使用binarySearch返回的索引插入该元素。如果添加元素后列表长度大于n
(实际上等于n+1
),请删除最小的元素(位于列表末尾)。通过这种方式,我们得到add的log(n)(与上一个解决方案中的TreeSet
相同),随机访问是O(1)。我唯一不喜欢的是,在列表中间的任意索引中,<代码> Advor(<代码> >)需要移动所有元素。(适用于小的n
但适用于大的n可能不行?)
对于这两种解决方案,我使用ReentrantReadWriteLock
-acquire writeLock()进行添加,使用readLock()进行get()/read操作
有更好的解决方案吗?**
Collections.synchronizedList(列表i)
使传递的参数成为线程安全列表
您可以在创建类时实现comparable接口并重写compareTo()方法,方法是在将元素添加到ArrayList()时按降序对元素排序,或者在排序时选择Comparator类并重写compareTo()方法
在total集合中,只有列表(I)支持随机访问
ArrayList<Employee> arrayList = Collections.synchronizedCollection(new ArrayList<Employee>(10));
ArrayList ArrayList=Collections.synchronizedCollection(新的ArrayList(10));
如果希望相同的项不应添加到ArrayList,则当新项(要添加)和最后一项(已添加)相等时,使用Comparator并返回0。以这样的方式处理返回值:如果(…==0){不添加到数据中)或者{添加它}。
我希望能给你一些提示。“访问随机索引时,请使用TreeSet迭代器进行迭代,直到达到所需的索引。”这个定义,与随机存取是相反的。“雅各布是的,我知道,这就是为什么我写的我不喜欢这个解决方案;但是请读我的第二个解决方案,你必须考虑一下)你到底在谈论多少个元素?在开始的时候你说的是十,所以转换是无关紧要的。它可能仍然是无关的F。或者千个元素b)您希望读取和修改之间的比率是多少?O(1)检索是否可以证明增加的插入成本是合理的?因此,最初的问题是n=10,但我试图对任何n进行概括并找到解决方案。关于吞吐量,让我们说读多于写。