请问怎样根据一个TreeMap的值中的数据进行排序?

千山独行 2011-06-21 06:08:24
现在的需求是TreeMap已经是对方传来的数据,所以不能改变(改成HashMap可以),按照TreeMap<String,Entity>的方式构成这个map,entity是一个实体,里面包含一个属性sort,实际上是要根据这个sort的值对这个TreeMap中的元素进行倒序排序,当然最后返回的值也必须是Map,哪位搞过类似的问题?
另外,根据key排序很好实现,但是根据value进行排序好像在网上找不到
...全文
9433 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiansweety 2012-11-12
  • 打赏
  • 举报
回复
为什么我试过了不行呢,就是按照exterminator的方法啊,没有按值排序,输出只是按键排序了,是a=3 b=1 c=1 d=2
xiansweety 2012-11-12
  • 打赏
  • 举报
回复
上面的程序是我把2楼的程序修改了一下写出来的,这样得出的结果也是TreeMap,而且刚刚实现过了,没有问题
xiansweety 2012-11-12
  • 打赏
  • 举报
回复
/** * @author * 对TreeMap按值进行排序的比较器 * */ public class ByValueComparator implements Comparator<Map.Entry<String, Integer>> { TreeMap<String, Integer> base_map; public ByValueComparator(TreeMap<String, Integer> base_map) { this.base_map = base_map; } @Override public int compare(Map.Entry<String, Integer> arg0, Map.Entry<String, Integer> arg1) { String key0=arg0.getKey(); String key1=arg1.getKey(); if (!base_map.containsKey(key0) || !base_map.containsKey(key1)) { return 0; } if (base_map.get(key0) < base_map.get(key1)) { return 1; } else if (base_map.get(key0) == base_map.get(key1)) { return 0; } else { return -1; } } } 接下来是调用该比较器的排序程序 TreeMap newMap = new TreeMap(); newMap.put("dsaf1", 1); newMap.put("dsaf9", 9); newMap.put("dsaf4", 4); newMap.put("dsaf7", 7); ByValueComparator bvc =new ByValueComparatornewMap);//newMap是要进行排序的TreeMap List<Map.Entry<String, Integer>> newList=new ArrayList<Map.Entry<String, Integer>>(map1.entrySet()); Collections.sort(newList, bvc); for(Map.Entry<String, Integer> map:newList){ System.out.println(map); }
gc_8973chun 2012-10-16
  • 打赏
  • 举报
回复
看看先

zhuhaowolf 2012-02-21
  • 打赏
  • 举报
回复
exterminator
牛人啊,佩服
fp862 2011-12-09
  • 打赏
  • 举报
回复
看了半天,好像这样是实现了对TreeMap中的数据的排序。有没有这改变TreeMap本身排序规则的办法,而不是利用List结构将其中的数据取出来,再用Collections的sort方法排序的?也就是说,先用TreeMap(Comparator<? super K> comparator)
构造函数定义好规则,然后再将数据用putAll()放到TreeMap实例中去。
longwang9527 2011-10-08
  • 打赏
  • 举报
回复
exterminator
大神
千山独行 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chenchenyangll 的回复:]

重写比较器 类似LS的
[/Quote]
实现一个比较器吗?直接实现,是根据key进行排序的,不是根据value
千山独行 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 benfangdewoniu 的回复:]

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.T……
[/Quote]
你这个实际还是对List排序啊。你的例程中等于是对key的list,按值的大小倒序进行排序,但是最后返回的是值的List,我要求返回一个TreeMap
exterminator 2011-06-22
  • 打赏
  • 举报
回复
可以排序的
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("d", 2);
map.put("c", 1);
map.put("b", 1);
map.put("a", 3);

List<Map.Entry<String, Integer>> infoIds =
new ArrayList<Map.Entry<String, Integer>>(map.entrySet());

//排序前
for (int i = 0; i < infoIds.size(); i++) {
String id = infoIds.get(i).toString();
System.out.println(id);
}
//d 2
//c 1
//b 1
//a 3

//排序
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
//return (o2.getValue() - o1.getValue());
return (o1.getKey()).toString().compareTo(o2.getKey());
}
});

//排序后
for (int i = 0; i < infoIds.size(); i++) {
String id = infoIds.get(i).toString();
System.out.println(id);
}
千山独行 2011-06-22
  • 打赏
  • 举报
回复
刚看到一篇文章,全文如下:
前几天有人问我一个问题,是对毕业生去向进行统计。统计每个去向的人数。我想用TreeMap来进行存储,需要进行排序。要求是根据人数来降序排序。关键是TreeMa是根据红黑树的数据结构,是平衡树,只能根据key来排序,是不能根据value来排序的。因为红黑树的数据结构就是根据key的大小来组织起来的,如果不根据key来排序根本就不能形成TreeMap。必须根据key来排序,默认是根据key的自然排序来组织,比如integer的大小,String的字典排序。如果你的key不能根据默认排序得到,你就需要来继承comparable接口,实现compareTo方法来定义自己的排序方法。

Collator好像是国际化的问题,说的是java对于有中文的排序出问题。

看来想在TreeMap中根据value来排序的想法是不能实现的了。只能换另一种解决方案了。
千山独行 2011-06-22
  • 打赏
  • 举报
回复
exterminator的方法完全正确呀,多谢各位哈
qqlwq123 2011-06-22
  • 打赏
  • 举报
回复
这样可以不?

HashMap<String, Integer> hm = new HashMap<String, Integer>();
HashMap<String, Integer> hm2 = new HashMap<String, Integer>(); //最后需要的HashMap
hm.put("a", 4);
hm.put("b", 5);
hm.put("c", 8);
hm.put("d", 10);
Iterator<String> i = hm.keySet().iterator();
ArrayList<String> l1 = new ArrayList<String>();
ArrayList<Integer> l2 = new ArrayList<Integer>();
while(i.hasNext()) {
String strr = i.next();
l1.add(strr);
l2.add(hm.get(strr));
}
for(int k = 0; k < l2.size();k++) {
int tmp = k;
for(int l = k+1; l < l2.size()-1;l++) {
if(l2.get(tmp)<l2.get(l)) {
tmp = l;
}
}
String strs = l1.get(tmp);
Integer ints = l2.get(tmp);
hm2.put(strs, ints);
l1.remove(tmp);
l2.remove(tmp);
k = -1;
}
Iterator<String> ii = hm2.keySet().iterator();
while(ii.hasNext()) {
System.out.println(hm2.get(ii.next()));
}
chenchenyangll 2011-06-21
  • 打赏
  • 举报
回复
重写比较器 类似LS的
benfangdewoniu 2011-06-21
  • 打赏
  • 举报
回复
package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.TreeMap;

public class SortMapByValue {
public static void main(String[] args){
TreeMap<String,Integer> newMap=new TreeMap<String,Integer>();
newMap.put("dsaf1", 1);
newMap.put("dsaf9", 9);
newMap.put("dsaf4", 4);
newMap.put("dsaf7", 7);
newMap.put("dsaf6", 6);
newMap.put("dsaf3", 3);
newMap.put("dsaf10", 10);


ByValueComparator bvc =new ByValueComparator(newMap);
List<String> newList=new ArrayList<String>(newMap.keySet());
Collections.sort(newList, bvc);
for(String str:newList){
System.out.println(str+"================================="+newMap.get(str));
}

}

/**
* @description
* 对HashMap按值进行排序
*
* */
static class ByValueComparator implements Comparator<String> {

TreeMap<String, Integer> base_map;

public ByValueComparator(TreeMap<String, Integer> base_map) {

this.base_map = base_map;

}

public int compare(String arg0, String arg1) {

if (!base_map.containsKey(arg0) || !base_map.containsKey(arg1)) {

return 0;

}

if (base_map.get(arg0) < base_map.get(arg1)) {

return 1;

} else if (base_map.get(arg0) == base_map.get(arg1)) {

return 0;

} else {

return -1;

}

}

}

}
healer_kx 2011-06-21
  • 打赏
  • 举报
回复
TreeMap<Key, Entity>


Key类应该是一个含有sort值,并且支持Comparable接口的(好根据Key),

因为你要重新排序,肯定要创建TreeMap<Key, Entity>了。

62,612

社区成员

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

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