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
接口所需的entries
、keys
和values
字段为期望为了与它们的顺序保持一致,按值对它们进行排序并不是一件容易的事,至少需要在现有类中覆盖这些字段。以TreeMap
类为例。键存储在树数据结构中,所有三个字段的顺序取决于插入到树中的键。此外,您不能重写树的比较器来忽略键本身,因为该类的一些基本映射属性依赖于键之间的树比较而非值.
这与仅在需要时对映射项进行排序相反,后者是一项简单得多的任务。如果您需要经常使用已排序的映射项,并且在这些使用之间往往会修改映射,那么维护这样的数据结构是值得的,否则您应该对条目进行排序并单独存储以备将来使用。
如果您决定维护按值排序的映射,那么您可能需要自己实现它。尝试使用这篇文章中的答案