Java Map排序

sinat_27250809 2018-06-28 04:21:25
定义这样形式的map:
Map<Integer, Map<Integer, Integer>> map = new Tree Map<Integer, Map<Integer, Integer>>();

如何根据第二个Map中的value排序?不能用map的话还有什么简单的解决方式?
...全文
371 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
verejava 2018-06-30
  • 打赏
  • 举报
回复
用 List Comparable 和 Collections 排序
sinat_27250809 2018-06-29
  • 打赏
  • 举报
回复
引用 6 楼 weixin_40852944 的回复:
不好意思,没太理解你的场景,你可以把你的顶点的那个少说几个,但是要说全,比如1->3->5 ,那顶点对分别是什么?2->3->5,顶点对有分别是什么?

1->3->5的顶点对为<1,3><1,5><3,5>
2->3->5的顶点对为<2,3><2,5><3,5>
频次最高的<3,5>优先级高
简单点,应该就是两两组合
stacksoverflow 2018-06-29
  • 打赏
  • 举报
回复
是不是这样
每个定点对我定义一个数据结构比如MyNode,如下:
MyNode{
int from;
int to;
List 路径编号List;
}

然后维护一个堆排序的数据结构,按照路径编号List.size进行排序。

每产生一个路径,生成或重用定义的定点对,同时更新堆排序的结构。

需要的时候从堆顶向下取,就是从最多的开始取了。
weixin_40852944 2018-06-28
  • 打赏
  • 举报
回复
不好意思,没太理解你的场景,你可以把你的顶点的那个少说几个,但是要说全,比如1->3->5 ,那顶点对分别是什么?2->3->5,顶点对有分别是什么?
sinat_27250809 2018-06-28
  • 打赏
  • 举报
回复
引用 4 楼 weixin_40852944 的回复:
如果性能跟不上的话,建议看看是否可以更换实现方案。我刚写的时候也觉得有点呕吐。


再请教一个问题:我的场景大概是这样的,就是统计多条路径上,顶点对出现的频次,然后根据频次进行排序,您有没有更好的方法可以计算顶点对的频率,这个用枚举也太吃力了

如:顶点1到顶点6的路径为:1->3->5->2->6,顶点对有<1,3><1,5><1,2><1,6><3,5>....
顶点4到顶点9的路径为:4->5->2->6->9,顶点对有<4,6><4,2><4,5><4,9><5,6>....

多条路径分析后,<5,2><5,6><2,6>共出现2次,次数多的优先级高

weixin_40852944 2018-06-28
  • 打赏
  • 举报
回复
如果性能跟不上的话,建议看看是否可以更换实现方案。我刚写的时候也觉得有点呕吐。
sinat_27250809 2018-06-28
  • 打赏
  • 举报
回复
引用 2 楼 weixin_40852944 的回复:
自己写了一个,你看下是否满足你的场景

public static void main(String[] args) {

Map<Integer, Map<Integer, Integer>> map = new TreeMap<Integer, Map<Integer, Integer>>();
Map<Integer,Integer> m1= new HashMap<>();
m1.put(1,100);
map.put(11,m1);
Map<Integer,Integer> m2= new HashMap<>();
m2.put(-1,10);
map.put(12,m2);
Map<Integer,Integer> m3= new HashMap<>();
m3.put(2,101);
map.put(10,m3);
List<Map.Entry<Integer, Map<Integer, Integer>>> entryArrayList = new ArrayList<>(map.entrySet());
Collections.sort(entryArrayList, (o1,o2)->{
Map<Integer,Integer> ov1 = o1.getValue();
Map<Integer,Integer> ov2 = o2.getValue();
Integer var0 = 0;
for(Map.Entry<Integer,Integer> entry1:ov1.entrySet()){
for (Map.Entry<Integer,Integer> entry2:ov2.entrySet()){
var0 = entry1.getValue().compareTo(entry2.getValue());
}
}
return var0;
});
System.out.println(entryArrayList);
}

符合我的场景,但是我的数据量很大,我再测测速度,万分感谢!
weixin_40852944 2018-06-28
  • 打赏
  • 举报
回复
自己写了一个,你看下是否满足你的场景

public static void main(String[] args) {

Map<Integer, Map<Integer, Integer>> map = new TreeMap<Integer, Map<Integer, Integer>>();
Map<Integer,Integer> m1= new HashMap<>();
m1.put(1,100);
map.put(11,m1);
Map<Integer,Integer> m2= new HashMap<>();
m2.put(-1,10);
map.put(12,m2);
Map<Integer,Integer> m3= new HashMap<>();
m3.put(2,101);
map.put(10,m3);
List<Map.Entry<Integer, Map<Integer, Integer>>> entryArrayList = new ArrayList<>(map.entrySet());
Collections.sort(entryArrayList, (o1,o2)->{
Map<Integer,Integer> ov1 = o1.getValue();
Map<Integer,Integer> ov2 = o2.getValue();
Integer var0 = 0;
for(Map.Entry<Integer,Integer> entry1:ov1.entrySet()){
for (Map.Entry<Integer,Integer> entry2:ov2.entrySet()){
var0 = entry1.getValue().compareTo(entry2.getValue());
}
}
return var0;
});
System.out.println(entryArrayList);
}
weixin_40852944 2018-06-28
  • 打赏
  • 举报
回复
treeMap 是支持排序的

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧