如何在Java中对多重映射进行排序?

如何在Java中对多重映射进行排序?,java,data-structures,Java,Data Structures,因此,我尝试在Java中对多重映射进行排序,以下是映射的外观: Map<Integer, Pair<Double, Color>> inputMap; Map<Integer, Pair<Double, Color>> outputMap; Map-inputMap; 地图输出地图; 这是我的结对课: class Pair<Double, Color> { public final Double x; public fina

因此,我尝试在Java中对多重映射进行排序,以下是映射的外观:

Map<Integer, Pair<Double, Color>> inputMap;
Map<Integer, Pair<Double, Color>> outputMap;
Map-inputMap;
地图输出地图;
这是我的结对课:

class Pair<Double, Color> {
  public final Double x;
  public final Color y;
  public Pair(Double x, Color y) {
    this.x = x;
    this.y = y;
  }
}
类对{
公开决赛双x;
公共最终颜色y;
公共线对(双x,y色){
这个.x=x;
这个。y=y;
}
}
我正试着按一对中的第一项对它进行排序。我试着用这样的方法:

outputMap=newtreemap(inputMap)

但这并不完全符合我的想法。。。它似乎一点也不排序


如何按Pair.X对映射进行排序?

不能按映射值排序-只能按键排序

如果您需要对对象进行O(1)访问的HashMap和排序遍历,请创建一个排序列表并将相同的对象保留在那里

List<Pair<Double, Object>>outputList = inputMap.values().stream().sorted((o1, o2) -> 0 /*IMPLEMENT_COMPARATOR_HERE*/).collect(Collectors.toList());
ListoutputList=inputMap.values().stream().sorted((o1,o2)->0/*在此处实现比较器*/).collect(collector.toList());
如果映射是可变的,那么最好创建一个同时包含-map和list的类,并提供“add”、“get”和“remove”等方法。应避免直接进入这些结构


不要忘记同步两个数据结构上的操作,以使代码线程安全

不能按贴图值排序-只能按键排序

如果您需要对对象进行O(1)访问的HashMap和排序遍历,请创建一个排序列表并将相同的对象保留在那里

List<Pair<Double, Object>>outputList = inputMap.values().stream().sorted((o1, o2) -> 0 /*IMPLEMENT_COMPARATOR_HERE*/).collect(Collectors.toList());
ListoutputList=inputMap.values().stream().sorted((o1,o2)->0/*在此处实现比较器*/).collect(collector.toList());
如果映射是可变的,那么最好创建一个同时包含-map和list的类,并提供“add”、“get”和“remove”等方法。应避免直接进入这些结构

不要忘记同步两个数据结构上的操作,以使代码线程安全

所有实现(包括
TreeMap
)都按
键进行排序,而不是按
值进行排序

进一步提供其键的总顺序的映射

值对
映射图进行内部排序也会对性能造成不利影响,因为通过
键进行访问时,性能得到了优化


A仅将一个值与每个键关联。

当您查看

将指定值与此映射中的指定键关联(可选操作)如果映射以前包含键的映射,则旧值将替换为指定值。

因此,您用
Map
定义的内容甚至不是一个简单的概念。这就解释了为什么它的行为不符合你的预期


您正在寻找的是一个

一种SetMultimap,其给定键的值集保持排序;也就是说,它们构成了一个分类数据集

然后,您可以使用创建SortedSetMultimap

TreeMultimap<Integer, ColorPair> sortedSetMap = new TreeMultimap<>() `
TreeMultimap sortedSetMap=new TreeMultimap()`
并用
颜色对填充它

所有实现(包括
TreeMap
)按
键排序
而不是按
值排序

进一步提供其键的总顺序的映射

值对
映射图进行内部排序也会对性能造成不利影响,因为通过
键进行访问时,性能得到了优化


A仅将一个值与每个键关联。

当您查看

将指定值与此映射中的指定键关联(可选操作)如果映射以前包含键的映射,则旧值将替换为指定值。

因此,您用
Map
定义的内容甚至不是一个简单的概念。这就解释了为什么它的行为不符合你的预期


您正在寻找的是一个

一种SetMultimap,其给定键的值集保持排序;也就是说,它们构成了一个分类数据集

然后,您可以使用创建SortedSetMultimap

TreeMultimap<Integer, ColorPair> sortedSetMap = new TreeMultimap<>() `
TreeMultimap sortedSetMap=new TreeMultimap()`

并用突出显示的
颜色对填充它

{1=Pair{x=1.0, y=java.awt.Color[r=0,g=0,b=0]}, 3=Pair{x=2.0, y=java.awt.Color[r=0,g=0,b=255]}, 2=Pair{x=3.0, y=java.awt.Color[r=255,g=0,b=0]}}
您可以使用以下命令对地图进行排序:

Map<Integer, Pair<Double, Color>> sortedMap = map.entrySet().stream()
        .sorted(Comparator.comparingDouble(e -> e.getValue().x))
        .collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue,
                (p1, p2) -> p1,
                LinkedHashMap::new));

突出显示

{1=Pair{x=1.0, y=java.awt.Color[r=0,g=0,b=0]}, 3=Pair{x=2.0, y=java.awt.Color[r=0,g=0,b=255]}, 2=Pair{x=3.0, y=java.awt.Color[r=255,g=0,b=0]}}
您可以使用以下命令对地图进行排序:

Map<Integer, Pair<Double, Color>> sortedMap = map.entrySet().stream()
        .sorted(Comparator.comparingDouble(e -> e.getValue().x))
        .collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue,
                (p1, p2) -> p1,
                LinkedHashMap::new));

所有实现都按
键排序,而不是按
值排序。您想按整数键和对中的双精度还是仅按双精度排序?排序意味着顺序。当您希望能够对这些pair对象进行排序时,您需要定义(首先在概念上,然后在代码中)是什么使pair1键排序,而不是按
值排序。您想按整数键和对中的双精度还是仅按双精度排序?排序意味着顺序。当您希望能够对这些pair对象进行排序时,您需要定义(首先在概念上,然后在代码中)是什么使pair1