是否有按值排序的键的映射结构?



TreeMap结构是一个经典的映射结构,键按其自然顺序排序。例如,使用以下代码:

Map<String, Integer> map = new TreeMap<>();
map.put("apple", 100);
map.put("orange", 10);
map.put("banana", 5);

如果我想打印地图,比如:

System.out.println(map);

然后控制台将输出(按键的自然顺序):

{苹果=100,香蕉=5,橘子=10}

我的问题是:是否有任何可用的Map结构(UnknownMap)可以按值自动排序键?如果我们有这样的结构,如果我们将代码修改为:

Map<String, Integer> map = new UnknownMap<>();
map.put("apple", 100);
map.put("orange", 10);
map.put("banana", 5);
System.out.println(map);

控制台将输出:

{香蕉=5,橘子=10,苹果=100}

注意:这个问题不是问如何排序一个映射。相反,这是要求特定的排序映射实现在对映射进行任何更改(如put、remove等)时有效地按值排序。

维护按值排序的映射是非常重要的,并且肯定需要调整现有的数据结构。Map接口所需的entrieskeysvalues字段为期望为了与它们的顺序保持一致,按值对它们进行排序并不是一件容易的事,至少需要在现有类中覆盖这些字段。以TreeMap类为例。键存储在树数据结构中,所有三个字段的顺序取决于插入到树中的键。此外,您不能重写树的比较器来忽略键本身,因为该类的一些基本映射属性依赖于键之间的树比较而非.

这与仅在需要时对映射项进行排序相反,后者是一项简单得多的任务。如果您需要经常使用已排序的映射项,并且在这些使用之间往往会修改映射,那么维护这样的数据结构是值得的,否则您应该对条目进行排序并单独存储以备将来使用。

如果您决定维护按值排序的映射,那么您可能需要自己实现它。尝试使用这篇文章中的答案

最新更新