我有一个代码如下:
private final HashMap<Integer, X> map = new HashMap<>();
我需要将HashMap条目转换为一些DTO的列表(基于Map中的键和值)。我还需要它按键排序。
我注意到,由于我的密钥是整数,我可以通过以下方式访问它:
map.forEach(..);
而秩序却被拒绝了。这是最有效的方法吗?或者有更好的方法吗?
在这种情况下,我更关心效率而不是干净的代码。
编辑:我不想使用TreeMap,因为我也需要O(1)和NOT O(Log(N)来进行插入。
2条答案
按热度按时间zpf6vheq1#
IYou说:
我注意到,由于我的密钥是整数,我可以通过以下方式访问它:
map.forEach(..);
命令被撤销
你看到一些数字以排序的顺序出现仅仅是运气,而不是真正的排序。
Map
接口和HashMap
类在他们的Javadoc中明确声明他们不以任何特定的顺序迭代。这意味着你不应该依赖任何明显的排序。即使当前的实现确实在内部使用了排序,该实现也可以在未来的版本中自由更改为不同的排序或任意顺序,从而破坏你的应用。
👉**如果您想排序,您必须支付排序。**您可以选择提前支付或稍后支付。
提前支付
使用
NavigableMap
(或SortedMap
)提前付款,它按键的顺序维护您的条目。TreeMap
类是这些接口的一个实现。如果你需要并发性,ConcurrentSkipListMap
是另一个。稍后支付
先填充
Map
(如HashMap
),然后再付款。完成Map后,进行排序。Stream
进行排序,如智能Answer by WJS中所示。Map
构建NavigableMap
进行排序。举个例子。
运行时,请注意
map
如何以不同于创建顺序的顺序打印。相反,navMap
始终以键排序的顺序打印。或者,在您的例子中,您正在以特定顺序生成您想要的
List
。您可以稍后通过以非排序顺序生成列表,然后对该列表进行排序来支付。您可以按自然顺序排序或通过指定Comparator
进行排序。你说:
我不想使用TreeMap,因为我也需要O(1)和NOT O(Log(N)来进行插入。
注意过早的优化。除非你有大量的元素,或者经常重复这段代码,否则我会惊讶地发现任何重大的影响。执行一些基准测试或分析,而不是假设性能瓶颈。
yqyhoc1h2#
我需要将HashMap条目转换为一些DTO的列表(基于Map中的键和值)。我还需要它按键排序。
在插入过程中是否使用
TreeMap
或更高版本进行排序取决于您,但您仍然需要进行排序并产生成本。但为了解决您的问题,这里有一个替代方案。上面返回的列表将是不可变的。您也可以更改
.toList()
以返回特定类型的集合。下面是一个返回ArrayList
的集合。