Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-数据结构设计-固定大小、随机访问、线程安全、分类收集_Java_Sorting_Data Structures_Collections - Fatal编程技术网

Java-数据结构设计-固定大小、随机访问、线程安全、分类收集

Java-数据结构设计-固定大小、随机访问、线程安全、分类收集,java,sorting,data-structures,collections,Java,Sorting,Data Structures,Collections,因此,在某些问题上,我被要求实施以下措施: 固定大小(n=10)的数据结构,总是有序的(降序,不重要),线程安全,支持随机访问 我的解决方案是-使用树集,每当添加元素时,如果已经有n个元素,移除最小的元素(如果新元素大于它),然后添加新元素。否则,只需添加新元素。 访问随机索引时,使用TreeSet迭代器进行迭代,直到达到所需的索引 我不太喜欢这个解决方案。所以我想到了另一个解决方案: 使用大小为n的ArrayList。每当尝试添加元素时,对该元素执行Collections.binarySear

因此,在某些问题上,我被要求实施以下措施: 固定大小(n=10)的数据结构,总是有序的(降序,不重要),线程安全,支持随机访问

我的解决方案是-使用
树集
,每当添加元素时,如果已经有
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进行概括并找到解决方案。关于吞吐量,让我们说读多于写。