黑马程序员技术交流社区

标题: 比较器问题 [打印本页]

作者: 李月    时间: 2012-5-31 13:22
标题: 比较器问题
  1. import java.util.*;

  2. class StuNameComparator implements Comparator<String>//我想要按照地名排序
  3. {
  4.         public int compare(String s1,String s2)
  5.         {

  6.                 return s1.compareTo(s2);
  7.         }
  8. }


  9. class  MapTest2
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator());//传比较器的时候出错,说没有此构造方法,这是为什么呢?
  14.                                                                                                                                                    //当自定义的比较好器泛型定义为Student就不报错。

  15.                 tm.put(new Student("blisi3",23),"nanjing");
  16.                 tm.put(new Student("lisi1",21),"beijing");
  17.                 tm.put(new Student("alisi4",24),"wuhan");
  18.                 tm.put(new Student("lisi1",21),"tianjin");
  19.                 tm.put(new Student("lisi2",22),"shanghai");

  20.                
  21.                 Set<Map.Entry<Student,String>> entrySet = tm.entrySet();

  22.                 Iterator<Map.Entry<Student,String>> it = entrySet.iterator();

  23.                 while(it.hasNext())
  24.                 {
  25.                         Map.Entry<Student,String> me = it.next();

  26.                         Student stu = me.getKey();
  27.                         String addr = me.getValue();
  28.                         System.out.println(stu+":::"+addr);
  29.                 }
  30.         }
  31. }
复制代码
请问大家有什么办法解决呢?
作者: 李文富    时间: 2012-5-31 13:46
本帖最后由 李文富 于 2012-5-31 13:49 编辑

package cn.itcast.day1;
import java.util.*;
import java.util.Map.Entry;

class StuNameComparator implements Comparator<String>//我想要按照地名排序
{
        public int compare(String s1,String s2)
        {

                return s1.compareTo(s2);
        }
}


class  MapTest2
{
        public static void main(String[] args)
        {
                TreeMap<String,Student> tm = new TreeMap<String,Student>(new StuNameComparator());
                //传比较器的时候出错,说没有此构造方法,这是为什么呢?
                //当自定义的比较好器泛型定义为Student就不报错。
                /**
                         * 因为map传的是key值,所以你存放时应该将String对象作为key值传入你的比较器比较;
                        * 下面put存入方法的方法也一样;
                 * */

                tm.put("nanjing",new Student("blisi3",23));
                tm.put("beijing",new Student("lisi1",21));
                tm.put("wuhan",new Student("alisi4",24));
                tm.put("tianjin",new Student("lisi1",21));
                tm.put("shanghai",new Student("lisi2",22));

               
                Set<Entry<String,Student>> entrySet = tm.entrySet();

                Iterator<Entry<String, Student>> it = entrySet.iterator();

                while(it.hasNext())
                {
                        Entry<String, Student> me = it.next();

                        String stu = me.getKey();
                        Student addr = me.getValue();
                        System.out.println(stu+":::"+addr);
                }
        }
}
作者: 龚正军    时间: 2012-5-31 13:54
你问的问题自己已经回答上了,这就是泛型的由来啊!

compare();这个方法中构造函数是:compaer(Object s1,Object s2);如果你没有限定Object的具体子类,那么他默认为Object,你必须强制向下转型或则定义Object的泛型来解决这问题。

泛型就为此存在的!
作者: 彭盼    时间: 2012-5-31 14:00
仔细读读api文档,treemap集合构造方法传入的比较器是比较两个键的,不会去比较值,你的键是student对象,比较器当然比较student
作者: 凡延海    时间: 2012-5-31 17:05
TreeMap(Comparator<? super K> comparator)  构造一个新的、空的树映射,该映射根据给定比较器进行排序。
TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator());你自己构造的构造器要比较的值必须是Student的父类或者是其本身才行,而定义的比较器中要比较的是String数值和Student对象没有什么关系。
我改写了一下代码:
  1. class StuNameComparator implements Comparator<String>//我想要按照地名排序
  2. {
  3.         public int compare(String s1,String s2)
  4.         {

  5.                 return s1.compareTo(s2);
  6.         }
  7. }
  8. class Student{
  9.         public String name;
  10.         public int age;
  11.         public Student(String name,int age)
  12.         {
  13.                 this.name=name;
  14.                 this.age=age;
  15.         }
  16.        
  17. }


  18. public class  Test1
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 TreeMap<String,Student> tm = new TreeMap<String,Student>(new StuNameComparator());//传比较器的时候出错,说没有此构造方法,这是为什么呢?
  23.                                                                                                                                                    //当自定义的比较好器泛型定义为Student就不报错。
  24.                 tm.put("nanjing",new Student("blisi3",23));
  25.                 tm.put("beijing",new Student("lisi1",21));
  26.                 tm.put("wuhan",new Student("alisi4",24));
  27.                 tm.put("tianjin",new Student("lisi1",21));
  28.                 tm.put("shanghai",new Student("lisi2",22));

  29.                
  30.                 Set<Map.Entry<String,Student>> entrySet = tm.entrySet();

  31.                 Iterator<Map.Entry<String,Student>> it = entrySet.iterator();

  32.                 while(it.hasNext())
  33.                 {
  34.                         Map.Entry<String,Student> me = it.next();
  35.                         String addr = me.getKey();
  36.                         Student stu = me.getValue();
  37.                         System.out.println(stu+":::"+addr);
  38.                 }
  39.         }
  40. }
复制代码
显示的结果是:
day3anto.Student@1fb8ee3:::beijing
day3anto.Student@61de33:::nanjing
day3anto.Student@14318bb:::shanghai
day3anto.Student@ca0b6:::tianjin
day3anto.Student@10b30a7:::wuhan
这个结果显示地址是按照首字母的字母排序来排的
希望对楼主有帮助
作者: 李月    时间: 2012-5-31 22:44
我晓得了。谢谢大家。




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