黑马程序员技术交流社区
标题:
比较器问题
[打印本页]
作者:
李月
时间:
2012-5-31 13:22
标题:
比较器问题
import java.util.*;
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<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator());//传比较器的时候出错,说没有此构造方法,这是为什么呢?
//当自定义的比较好器泛型定义为Student就不报错。
tm.put(new Student("blisi3",23),"nanjing");
tm.put(new Student("lisi1",21),"beijing");
tm.put(new Student("alisi4",24),"wuhan");
tm.put(new Student("lisi1",21),"tianjin");
tm.put(new Student("lisi2",22),"shanghai");
Set<Map.Entry<Student,String>> entrySet = tm.entrySet();
Iterator<Map.Entry<Student,String>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Student,String> me = it.next();
Student stu = me.getKey();
String addr = me.getValue();
System.out.println(stu+":::"+addr);
}
}
}
复制代码
请问大家有什么办法解决呢?
作者:
李文富
时间:
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对象没有什么关系。
我改写了一下代码:
class StuNameComparator implements Comparator<String>//我想要按照地名排序
{
public int compare(String s1,String s2)
{
return s1.compareTo(s2);
}
}
class Student{
public String name;
public int age;
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
}
public class Test1
{
public static void main(String[] args)
{
TreeMap<String,Student> tm = new TreeMap<String,Student>(new StuNameComparator());//传比较器的时候出错,说没有此构造方法,这是为什么呢?
//当自定义的比较好器泛型定义为Student就不报错。
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<Map.Entry<String,Student>> entrySet = tm.entrySet();
Iterator<Map.Entry<String,Student>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<String,Student> me = it.next();
String addr = me.getKey();
Student stu = me.getValue();
System.out.println(stu+":::"+addr);
}
}
}
复制代码
显示的结果是:
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