按键或值对TreeMap进行排序

时间:2014-05-12 14:32:07

标签: java sorting map treemap

情况:

我有MapTreeMap更准确,看起来像

TreeMap<String, Integer>

我必须能够以递增或递减的方式对键或值进行排序。结果必须是Map之类的

Map<String, Integer>

不是ArrayList或类似的东西,因为我的代码的其余部分(读取:分配)将不再起作用。我搜索过但找不到符合我需求的东西。这甚至可能吗?双值不会丢失。

5 个答案:

答案 0 :(得分:3)

如果您使用两个BiMaps,每个BiMaps互相支持,那么您实际上有一个地图。 像这样的东西:

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

private BiMap<Integer, String> localid = HashBiMap.create();
private BiMap<String, Integer> inverse = localid.inverse();

你可以对待每个参考文献,localid&amp;逆,作为他们自己的地图,但改变为一个反映在另一个。唯一的小缺点是,现在键和值必须是唯一的,因为一个的值是另一个的键。对于大多数情况,这不是问题。

为了对其进行排序,您可以随时制作一个树形图的本地副本,并强制进行排序。例如。

ImmutableMap.copyOf(Maps.newTreeMap(bimap))

现在,如果您从未对地图进行更改,则会提供已排序的视图,您可以通过其中任何一个进行更改。

编辑:TreebasedTable为每个值都有两个键,您可以使用比较器对键集进行排序。我不确定这是否正是您所需要的,因为这些键集是独立的,但您可以稍微重构一下代码以使其成为可行的解决方案。

答案 1 :(得分:1)

如果地图很小并且迭代它是一个不常见的操作,一个解决方案就是使用HashMap(用于查找速度),然后在每次迭代时对条目进行排序。

另一种解决方案,如果你经常与直接地图查找进行这些迭代,并且如果值(而不仅仅是键)是唯一的,那么将维护两个有序地图,一个<String, Integer>和一个{{ 1}}。

答案 2 :(得分:0)

Guava的概念为BiMap。这就是你要找的东西吗?

答案 3 :(得分:0)

TreeMap的键按其可比性排序。

答案 4 :(得分:0)

尝试SortedMap

进一步提供其键的总排序的Map。地图是根据其键的自然顺序排序的,或者是通常在排序地图创建时提供的比较器。迭代有序映射的集合视图(由entrySet,keySet和values方法返回)时会反映此顺序。提供了几个额外的操作以利用订购。 (此接口是SortedSet的地图模拟。)