黑马程序员技术交流社区

标题: Map键值对,可不可以通过值的属性进行排序呢? [打印本页]

作者: 李哲    时间: 2012-3-20 09:09
标题: Map键值对,可不可以通过值的属性进行排序呢?
本帖最后由 李哲 于 2012-3-20 09:19 编辑

虽然键是唯一,而值不唯一。但是如果某map中,键值对的键和值都是唯一的,可以通过值的属性进行排序吗?

或者可以:
将map中所有的值存入到Set集合。因为Set具备迭代器。
所以可以迭代方式取出所有的值,再获取每一个值对应的键?

作者: 泮和顺    时间: 2012-3-20 09:20
可以通过2维数组来做 各自做1次交换 ..
作者: 尹震    时间: 2012-3-20 09:46
其实,用map集合中的TreeMap就可以进行自动排序,
但是,排的却是key值,若想通过值进行排序,就需要用到“比较器”,
实现Comparator接口,进行重写“compare”方法,若值是相同的,再比较键值,这样就可以进行值排序了。
所以,就算值相同也没关系。
作者: 陈汉帆    时间: 2012-3-20 14:43
技术+8?
作者: 马胜平    时间: 2012-3-20 15:18
  1.                 //将Map转换为Map.Entry
  2.                 Set set=map.entrySet();
  3.                 //为了能让集合能按照值进行排列,这里把集合set转为Map.Entry类型的数组。
  4.                 Map.Entry[]  entries=(Map.Entry[]) set.toArray(new Map.Entry[set.size()] );
  5.                 //按照指定的比较器和指定的排序规则对集合里的Map.Entry进行排序,这里是按照值从小到大的排序。
  6.                 Arrays.sort(entries, new Comparator(){
  7.                         @Override
  8.                         public int compare(Object o1, Object o2) {
  9.                                  Integer value1=(Integer) ((Map.Entry)o1).getValue();
  10.                                  Integer value2=(Integer) ((Map.Entry)o2).getValue();
  11.                                  return value1.compareTo(value2);
  12.                         }
  13.                        
  14.                 });
复制代码

作者: 李晓旭    时间: 2012-3-20 15:28
LZ问得问题确实不错,我怎么没想到!!怪不得有8分可以加{:soso_e142:}
作者: 职业规划-刘倩老师    时间: 2012-3-20 15:33
陈汉帆 发表于 2012-3-20 14:43
技术+8?


不好意思加错了,现在已经改过来了,因为我的失误,给你添加了困惑,真是抱歉
作者: 李哲    时间: 2012-3-20 15:53
物竞天择,适者生存。
作者: liumeng    时间: 2012-3-20 16:15
public class TreeSet1 {
public static void main(String[] args) {
        Map map=new HashMap();
        map.put("ggw",2);
        map.put("asdf",1);
       
          //将Map转换为Map.Entry
    Set set=map.entrySet();
        TreeSet ts=new TreeSet(new Comparator(){
        @Override
        public int compare(Object o1, Object o2) {
                 Integer value1=(Integer) ((Map.Entry)o1).getValue();
                 Integer value2=(Integer) ((Map.Entry)o2).getValue();
                 return value1.compareTo(value2);
        }});
        ts.addAll(set);
        Iterator ti=ts.iterator();
        while(ti.hasNext())
        {
               
                System.out.println(((Map.Entry)ti.next()).getValue());
        }
}
}

作者: 李飞    时间: 2012-3-20 17:41
1.    首先map集合的TreeMap就可以进行排序,是对键的排序
2.   如果要自定义排序的话,首先将取集合元素,由于map集合是双序列集合,
       1)通过keySet()取出集合所有的键,对应Set集合,遍历Set集合取出key对应的value
          2)通过entrySet()取出键值映射的关系,对应Set集合,遍历Set集合,取得键和值,当我们需要对TreeSet集合中的元素不具备比较功能,或是比较功能不适合时,需要让集合自身有比较性。这时就需要自定义一个比较器。
3.   其实这个时候就是对Set集合的排序了,而Set集合:TreeSet和HashSet两个了
        TreeSet集合自定义比较:
         1)集合元素自身具备比较性,集合元素类实现Comparable接口,compareTo方法,提供自然排序方法
        2)集合具备比较性。比较器,实现Comparator接口,compare方法。
        当有比较器的时候,以比较器为主
       HashSet集合自定义比较:
         我们要重写hashCode()和equals()方法,hashCode()用来判断集合元素对象,而equals()用来判断元素对象的属性值是否相同

而且都要重写toString方法
   
作者: lucky_xingxing    时间: 2012-3-20 19:43
LinkedHashMap会按照存入的顺序进行排序的




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