当前位置: 首页 > 知识库问答 >
问题:

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

宋望
2023-03-14

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

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

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

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

有没有更好的解决方案?

共有1个答案

谯灿
2023-03-14

**

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

您可以在创建类时实现comparable接口,并重写compareTo()方法,使其在您将元素添加到ArrayList时按降序对元素进行排序

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

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

如果您想要相同的项目不应该添加到ArrayList中,请使用比较器并在新项目(想要添加)和最后一项(已经添加)相等时返回0。以这样一种方式处理返回值,如果(…==0){不要添加到数据中)否则{添加它}。我希望我能给你一些提示。

 类似资料:
  • 问题内容: 我正在使用这个简单的查询来对ms-access数据库使用随机排序: 当我使用Microsoft Access 2010测试它时,它工作正常 但是,当我使用经典asp调用此查询时,随机排序不起作用。 这是我的代码: 问题答案: 您只需要对随机生成器“加盐”即可:

  • 问题内容: 在多个线程之间共享该类的一个实例是否有效?并特别从多个线程调用? 问题答案: 从某种意义上讲,它是线程安全的,当被多个线程使用时仍会生成随机数。 Sun / Oracle JVM实现使用同步和AtomicLong作为种子来提高线程之间的一致性。但是,文档中似乎并没有在所有平台上对此进行担保。 我不会编写要求这种保证的程序,尤其是当您无法确定调用顺序时。

  • 我有一个应用程序,它有一个ConcurrentHashMap本地存储一个存储在外部服务器上的数据副本。地图每隔几秒钟就会更新一次数据的新副本。 我有一个循环,每隔几秒钟运行一次,它可以访问HashMap并按照值的顺序将元素添加到数组中(实际上它做的事情还多一些,但这并不相关)。我的问题是,如果数据在创建数组的过程中发生了变化,您可能会在不同的地方有重复的键,或者完全省略一些键。 示例: 如您所见,

  • 问题内容: 我从一个非常简单的多线程示例开始。我试图做一个线程安全的计数器。我想创建两个线程,使计数器间歇地增加到1000。以下代码: 据我所知,while循环现在意味着只有第一个线程才能访问计数器,直到达到1000。输出: 我该如何解决?如何获得共享计数器的线程? 问题答案: 两个线程都可以访问您的变量。 您看到的现象称为线程饥饿。输入代码的受保护部分后(很抱歉,我之前错过了它),其他线程将需要

  • 我目前正在研究普林斯顿算法第一部分的队列分配。其中一个任务是实现随机队列。这是一个关于使用不同数据结构的实现和权衡的问题。 问题: 随机化队列类似于堆栈或队列,只是从数据结构中的项中均匀随机地选择删除的项。创建实现以下API的通用数据类型: 这里的问题是实现de队列操作和迭代器,因为de队列删除并返回随机元素,迭代器以随机顺序迭代队列。 1.数组实现: 我考虑的主要实现是数组实现。除了随机性之外,

  • 8.1节中,我们看到了各种划分方法;并且在8.2节,了解了对性能影响的各种因素。如何在设计数据结构的时候,使用这些信息提高多线程代码的性能?这里的问题与第6、7章中的问题不同,之前是关于如何设计能够安全、并发访问的数据结构。在8.2节中,单线程中使用的数据布局就会对性能产生巨大冲击(即使数据并未与其他线程进行共享)。 关键的是,当为多线程性能而设计数据结构的时候,需要考虑竞争(contention