本帖最后由 司懿卓 于 2013-1-27 19:13 编辑
先上代码:- public class Student implements Comparable //comparable接口
- {
- private String name;
- private int age;
- Student(String name, int age)
- {
- this.name = name;
- this.age = age;
- }
- public String getName()
- {
- return this.name;
- }
- public int getAge()
- {
- return this.age;
- }
- public int hashCode() //hashCode重写
- {
- return this.name.hashCode() + this.age * 9;
- }
- public boolean equals(Object obj) //equals重写
- {
- if (!(obj instanceof Student))
- throw new ClassCastException("非法类型"); //RuntimeException
- Student stu = (Student)obj;
- return this.name.equals(stu.name)&& this.age == stu.age;
- }
- public int compareTo(Object obj) //compareTo重写
- {
- if (!(obj instanceof Student))
- throw new ClassCastException("非法类型");
- Student stu = (Student)obj;
- int num = new Integer(this.age).compareTo(new Integer(stu.age)); //比较
- if (num == 0)
- return this.name.compareTo(stu.name);
- return num;
- }
- public String toString()
- {
- return "name:" + name + ",age:" + age;
- }
- }
复制代码 代码2:- import java.util.*;
- public class TreeSetTest
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- TreeMap<Student, String> tm = new TreeMap<>(new Comparator<Student>() //匿名内部比较器
- {
- public int compare(Student s1, Student s2)
- {
- return 1; //按照存入状态排序
- }
- });
- tm.put(new Student("张三", 19), "北京");
- tm.put(new Student("李四", 25), "上海");
- tm.put(new Student("王五", 18), "广东");
- tm.put(new Student("冯六", 19), "杭州");
- //第一种
- Set<Student> keySet = tm.keySet(); //keySet获取key
- for (Iterator<Student> it = keySet.iterator(); it.hasNext(); )
- {
- Student stu = it.next();
- sop("name:" + stu.getName() + ", age:" + stu.getAge() +
- ", addr:" + tm.get(stu)); //输出内容
- }
- //第二种
- Set<Map.Entry<Student, String>> entrySet = tm.entrySet(); //entrySet获取映射关系
- Iterator<Map.Entry<Student, String>> iter = entrySet.iterator();
- while (iter.hasNext())
- {
- Map.Entry<Student, String> me = iter.next();// Map.Entry是entrySet集合的元素类型.
- Student stu1 = me.getKey();
- String addre = me.getValue();
- sop("key=" + stu1 + ",addre:" + addre);
- }
- }
- }
复制代码 上面的需求是对Student对象进行自定排序.
并且使用了两种Map集合输出方式.
但是,再加入匿名内部比较器后,第一种方法的addr无法正常输出.
第二种却可以.
取消比较器. 输出正常.
这是不使用比较器的输出结果:
这是使用比较器的输出结果:
---------------------------------------------------------------------------
谢谢帮忙解决问题的朋友.. 还是自己的问题,在做其他练习,就想着等这个解决. 这是我的错.
public V get(Object key)返回指定键所映射的值,如果对于该键而言,此映射不包含任何映射关系,则返回 null。 更确切地讲,如果此映射包含从键 k 到值 v 的映射关系,根据该映射的排序 key 比较起来等于 k,那么此方法将返回 v;否则返回 null。(最多只能有一个这样的映射关系。)
上面的是API对get方法的解释.. 如果重写了元素的比较器,也要注意其他情况.. 这就是错误的例子.
感谢zyx67786110 以及所有回帖的朋友.
|
-
使用.jpg
(53.86 KB, 下载次数: 200)
使用比较器
|