3

我们有两个互补地图的代码,如下所示:

private final Map<Integer, String> idToName = new HashMap<Integer, String>();
private final Map<String, Integer> nameToID = new TreeMap<String, Integer>();

每当我们将某些东西放入其中时,我们也会像这样放入另一个(键和值颠倒):

nameToID.put(name, id);
idToName.put(id, name);

我们遇到了这个应用程序的内存问题。这里似乎有很多重复。有没有办法提高内存效率?我们可以使用一些单一的结构?我意识到这可能是以时间效率为代价的,所以我对权衡取舍很感兴趣。

4

3 回答 3

5

这正是Guava BiMap所做的,尽管您只能获得如此多的额外内存效率。最大的优势BiMap不是内存效率,而是“它负责确保值是唯一的,并且你不能忘记更新逆映射”。

BiMap<Integer, String> idToName = HashBiMap.create();
idToName.put(1, "foo");
idToName.inverse(); // returns a BiMap mapping "foo" to 1
idToName.inverse().put("bar", 2); // idToName now has an extra mapping 2 -> "bar"

(披露:我为 Guava 做出了贡献。)

于 2012-10-05T18:35:19.803 回答
0

您可以考虑使用 Google Guava 中的 BiMap 类(docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/BiMap.html),但我不知道它会占用更多内存高效的。

private final Map<Integer, String> idToName = new BiMap<Integer, String>();
private final Map<String, Integer> nameToID = idToName.inverse();

您只需添加到idToName地图中:

idToName.put(name, id);
于 2012-10-05T18:37:55.170 回答
0

您也可以使用 apache commons BidiMap

BidiMap 公开了一个方法,该方法inverseBidiMap()获取此映射的视图,其中键和值被反转。

希望有帮助!

于 2012-10-05T18:38:28.150 回答