黑马程序员技术交流社区

标题: 做练习发现一个问题,怎么对Map集合中的Value进行排序呢? [打印本页]

作者: 郑枫    时间: 2012-11-27 14:59
标题: 做练习发现一个问题,怎么对Map集合中的Value进行排序呢?
例如
map.put("a",4);
map.put("f",2);
map.put("s",6);
map.put("r",3);
求讲解。
作者: 郑枫    时间: 2012-11-27 19:52
{:soso_e101:}  现在论坛咋这么冷清啊。。。。
作者: 程宏志    时间: 2012-11-27 23:25
没时间做给个思路吧,一般排序的话,你可以写个比较器,不知行不,但是TreeMap中是可以的,HashMap中的构造函数中没有传比较器的说法

第二种,你通过Map.Entryl来获取键和值得集合,然后获取键值,在对键值来排序

做的题中好像只看到过对TreeMap的排序,没看对HashMap的排序,
不知楼主创建的对象是使用TreeMap还是HashMap的,建议使用TreeMap,这个比较好做
作者: 崔政    时间: 2012-11-27 23:33
有一个类,叫TreeMap,使用方法与TreeSet类似。你看看API吧。
作者: 郑枫    时间: 2012-11-28 20:13
程宏志 发表于 2012-11-27 23:25
没时间做给个思路吧,一般排序的话,你可以写个比较器,不知行不,但是TreeMap中是可以的,HashMap中的构造 ...

:( TreeMap中只默认是对Key进行排序呀,我找过,没找到对Value进行排序的功能。。:'(
作者: 郑枫    时间: 2012-11-28 20:16
崔政 发表于 2012-11-27 23:33
有一个类,叫TreeMap,使用方法与TreeSet类似。你看看API吧。

:( 菜鸟较笨,求老鸟指点一二。
作者: 陈重    时间: 2012-12-1 13:58
/*
2012年12月1日12:47:58
*/
import java.util.*;
public class TestValue
{
public static void sop(Object obj)
{
  System.out.println(obj);
}
public static void main(String[] args)
{
  //定义一个容器,用来存放元素
  TreeMap<String,Integer> map = new TreeMap<String,Integer>(new ValueComparator());
  map.put("a",4);                                           //比较器类型是K及其父类
  map.put("b",2);
  map.put("c",6);
  map.put("d",3);
  //取出键值的映射关系存入Set集合中
  Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
  //产生迭代器(Map集合没有迭代器,只能通过List 或Set集合产生)
  Iterator<Map.Entry<String,Integer>> it = entrySet.iterator();
  //开始迭代元素
  while (it.hasNext())
  {
   Map.Entry<String,Integer> me = it.next();//迭代出的是映射关系,所以me的参数类型是Map.Entry
   Integer value = me.getValue();//通过迭代出的映射关系,调用Map.Entry中的getValue方法.得到值(V)
   sop(value);  
  }
}
}
//重写比较器
class ValueComparator implements Comparator<String>
{
public int compare(String a1,String a2)
{
  Integer num = a2.compareTo(a1);
  return num;
}
}
/*class ValueComparator implements Comparator<Integer>
{
public int compare(Integer a1,Integer a2)
{
  Integer num = a2.compareTo(a1);
  return num;
}
}
这里为什么被注释了?我查看了下API:
public TreeMap(Comparator<? super K> comparator)
K - 此映射维护的键的类型
我个人的理解:比较器的类型是键的类型及其父类.
*/
最后写个小结:都是个人理解,有的地方不对,还望大神指出
你希望排列Value.我的思路是,先把一组元素存入TreeMap中,存的时候TreeMap会调用
自身的比较器:按键(K)类型自然排序即(a,b,c,d).但是你希望按Value排序,我想重写
比较器,查看文档发现比较器类型是K及其父类.也就是说你不可能在现有TreeMap结构
下去比较Value.
我本打算把Value再存入一个集合中,完成排序.最后没这么做.我个人的看法是,Map这个集合
到底是干什么用的?它是一种映射关系,你排了key,对应的value也就排列了.它提供的比较器就可以看出
,排好键就行了,再去动Value其实际意义再哪了,对于这样一种映射关系?如果你想排数字,你大可把数字放到
Key的位置上,即把要排的放到Key上就好了.个人愚见.





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2