如何保持哈希表中元素的顺序

发布于 2024-08-05 02:35:52 字数 90 浏览 8 评论 0原文

我有一个哈希表。 Values() 方法以与插入顺序不同的顺序返回值。如何以与插入顺序相同的顺序获取值?使用 LinkedHashmap 是一种替代方法,但它不同步。

I have a hashtable . values() method returns values in some order different from the order in which i am inserted.How can i get the values in the same order as i inserted?Using LinkedHashmap is an alternative but it is not synchronized.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

一杯敬自由 2024-08-12 02:35:52

使用 LinkedHashMap

哈希表和链表
Map 接口的实现,
具有可预测的迭代顺序。这
实现与 HashMap 的不同之处在于
它维护一个双向链表
遍历其所有条目。
这个链表定义了迭代
ordering,通常是顺序
其中钥匙被插入到
地图(插入顺序)。注意
插入顺序不受影响,如果
键被重新插入到地图中。 (一个
密钥 k 被重新插入到映射 m 中,如果
m.put(k, v) 在以下情况下被调用
m.containsKey(k) 将返回 true
就在调用之前。)

Collections.synchronizedMap()

因此,例如:

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());

Use a LinkedHashMap.

Hash table and linked list
implementation of the Map interface,
with predictable iteration order. This
implementation differs from HashMap in
that it maintains a doubly-linked list
running through all of its entries.
This linked list defines the iteration
ordering, which is normally the order
in which keys were inserted into the
map (insertion-order). Note that
insertion order is not affected if a
key is re-inserted into the map. (A
key k is reinserted into a map m if
m.put(k, v) is invoked when
m.containsKey(k) would return true
immediately prior to the invocation.)

combined with Collections.synchronizedMap().

So, for example:

Map<String, String> map = Collections.synchronizedMap(
  new LinkedHashMap<String, String>());
一指流沙 2024-08-12 02:35:52

您可以包装 LinkedHashMap 并同步,也可以使用 Collections.synchronizedMap 实用程序创建同步的 LinkedHashMap

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

来自 JavaDoc:

如果多个线程同时访问一个链接哈希图,并且至少有一个线程在结构上修改了该图,则必须进行外部同步。这通常是通过同步一些自然封装地图的对象来完成的。如果不存在这样的对象,则应使用 Collections.synchronizedMap 方法“包装”映射。最好在创建时完成此操作,以防止意外地不同步访问地图

You could either wrap a LinkedHashMap and synchronize or you could use the Collections.synchronizedMap utility to create a synchronized LinkedHashMap:

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

From the JavaDoc:

If multiple threads access a linked hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. This is typically accomplished by synchronizing on some object that naturally encapsulates the map. If no such object exists, the map should be "wrapped" using the Collections.synchronizedMap method. This is best done at creation time, to prevent accidental unsynchronized access to the map

佼人 2024-08-12 02:35:52

我非常确定哈希表未排序的原因是为了提高存储和检索速度。因此,我建议使用外部结构来维护排序,并仅使用哈希表来存储值(用于快速查找)。

I'm pretty sure that the reason hashtables are unsorted is to aid storage and retrieval speed. Because of this I would suggest using an external structure to maintain ordering and just using the hashtable for storing values (for fast lookup).

九命猫 2024-08-12 02:35:52

哈希表本质上是无序的,因此您使用了错误的数据结构。由于您没有指定您使用的语言,我无法建议替代语言,但您需要某种类型的有序键/值集。

A hash table is inherently unordered, so you are using the wrong data structure. Since you don't specify what language you are using I cannot suggest an alternate, but you need some type of ordered key/value set.

淡写薰衣草的香 2024-08-12 02:35:52

如果jdk1.6你只有两种类型的有序映射EnumMap和LinkedHashMap。两者不同步。如果您只需要记住顺序,请使用

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

如果您想排序然后使用 ConcurrentSkipListMap

If jdk1.6 you have only two type of ordered map EnumMap and LinkedHashMap. Both of them are not synchronized. If you just need to remember the order, use

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

if you want sorted then use ConcurrentSkipListMap

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文