Java 按键或值对树映射进行排序

Java 按键或值对树映射进行排序,java,sorting,map,treemap,Java,Sorting,Map,Treemap,情况: 我有一个地图,一个树状地图,更准确地说,它看起来像 TreeMap<String, Integer> 不是ArrayList或类似的东西,因为我代码的其余部分(读取:allot)将不再工作。我已经找过了,但找不到任何适合我需要的东西。这可能吗?双值可能不会丢失。如果映射很小,并且在其上迭代是一种不常见的操作,一种解决方案是只使用哈希映射(用于查找速度),然后在每次迭代时对条目进行排序 另一种解决方案是,如果与直接地图查找相比,您经常进行这些迭代,并且如果值(而不仅仅是键)是

情况:

我有一个
地图
,一个
树状地图
,更准确地说,它看起来像

TreeMap<String, Integer>

不是
ArrayList
或类似的东西,因为我代码的其余部分(读取:allot)将不再工作。我已经找过了,但找不到任何适合我需要的东西。这可能吗?双值可能不会丢失。

如果映射很小,并且在其上迭代是一种不常见的操作,一种解决方案是只使用
哈希映射(用于查找速度),然后在每次迭代时对条目进行排序


另一种解决方案是,如果与直接地图查找相比,您经常进行这些迭代,并且如果值(而不仅仅是键)是唯一的,则需要维护两个排序的地图,一个是
,另一个是

,如果地图很小,并且在其上进行迭代是一种不频繁的操作,一种解决方案是只使用
HashMap
(用于查找速度),然后在每次迭代时对条目进行排序


另一个解决方案是,如果与直接地图查找相比,您经常进行这些迭代,并且如果值(而不仅仅是键)是唯一的,那么将维护两个排序的地图,一个是
,另一个是

具有。这就是你要找的吗?

的概念是。这就是您要寻找的吗?

树映射的键按其可比性排序。

树映射的键按其可比性排序。

如果使用两个互为备份的双映射,则实际上只有一个映射。 有点像:

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();
现在,如果您从未对地图进行过更改,这将提供一个排序视图,您可以通过任何一种方式进行更改


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

如果您使用两个互为备份的BIMAP,那么您实际上拥有一个映射。 有点像:

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();
现在,如果您从未对地图进行过更改,这将提供一个排序视图,您可以通过任何一种方式进行更改

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

试试SortedMap

进一步提供其键的总顺序的映射。映射按照其键的自然顺序排序,或者由通常在已排序映射创建时提供的比较器进行排序。迭代排序映射的集合视图(由entrySet、keySet和values方法返回)时,会反映此顺序。提供了几个附加操作以利用订购。(此界面与SortedSet的地图类似。)

尝试SortedMap


进一步提供其键的总顺序的映射。映射按照其键的自然顺序排序,或者由通常在已排序映射创建时提供的比较器进行排序。迭代排序映射的集合视图(由entrySet、keySet和values方法返回)时,会反映此顺序。提供了几个附加操作以利用订购。(此接口与SortedSet的map类似。)

您可以编写自己的map实现,允许您按值排序。据我所知,这样的事情是不存在的。您的自定义实现可以将树中项目的索引按值排序,以便快速检索。您所说的双值可能不会丢失是什么意思。?你是说重复值吗?另一点不清楚的是,如果您的所有代码都是针对
Map
TreeMap
编写的,那么您可以编写自己的Map实现,允许您按值排序。据我所知,这样的事情是不存在的。您的自定义实现可以将树中项目的索引按值排序,以便快速检索。您所说的双值可能不会丢失是什么意思。?你是说重复值吗?另一点不清楚的是,如果您的所有代码都是针对
Map
TreeMap
编写的,那么他已经在使用
SortedMap
TreeMap
是一个
SortedMap
。他还需要能够根据值对其进行排序,这是
SortedMap
无法做到的。他已经在使用
SortedMap
TreeMap
是一个
SortedMap
。他还需要能够根据值对其进行排序,
SortedMap
不能做到这一点。这里需要理解的一个关键点是,使用
TreeMap
意味着映射是按排序顺序存储的,但任何映射都可以按排序顺序进行迭代(只需将条目复制到列表中,并在迭代之前对其进行排序)。这里需要理解的一个关键点是,使用
TreeMap
意味着地图是按排序顺序存储的,但任何地图都可以按排序顺序迭代(只需将条目复制到列表中,并在迭代之前对其进行排序)。如果您使用了正确的its,但是它没有回答问题。如果您使用了正确的its,这将是正确的,但它没有回答问题。
TreeBasedTable
的+1。然后你可以有一个
或任何东西,可以对行或列进行自由排序。是的,但是我能有效地从给定的字符串到给定的整数吗?我不确定,但与我经常使用的BiMap相比,我对它有点不熟悉。嗯,现在我仔细观察,我发现没有办法获得按列排序的视图,只能按行排序。getRowMap和getColumnMap都返回排序的映射,但它们并不是问题的答案。树型表的作用类似于矩阵,其中一个值由两个键标识。因此,getRowMap返回所有条目w
ImmutableMap.copyOf(Maps.newTreeMap(bimap))