黑马程序员技术交流社区
标题:
Map子类TreeMap问题
[打印本页]
作者:
胡志翔
时间:
2013-10-28 00:30
标题:
Map子类TreeMap问题
Set集合的TreeSet中的元素如果不具备比较性,要让元素实现Comparable接口,并且实现compareTo()方法,或则让TreeSet集合本身具备一个比较器,即编写一个比较器,实现Comparator接口,并实现其方法compare()方法,将比较器作为参数传递给集合,那么Map集合中的TreeMap中的也要这样做吗?
HashMap中存入的元素本身也要去覆盖equals()方法和hashCode()方法去保证唯一性吗?
作者:
wenbaoxing
时间:
2013-10-28 08:06
是的,map集合中存的是键和值,键是一个set集合,可以对这个set集合进行指定顺序的排序。这有个示例:
package cn.itcast.day1;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
class StuNameComparator implements Comparator<Student> {
/* 按照姓名排序,如果姓名相同,那么按照年龄排序 */
public int compare(Student o1, Student o2) {
int num = o1.getName().compareTo(o2.getName());
if (num == 0) {
return o1.getAge() - o2.getAge();
}
return num;
}
}
class Student /* implements Comparable<Student> */{// 十七具有比较性,防止排序的出现异常
private String name;// 姓名
private int age;// 年龄
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
/*
// 重写hashCode()方法
public int hashCode() {
return this.name.hashCode() + this.age * 12;
}
//重写equals方法
public boolean equals(Object ob) {
if (!(ob instanceof Student))
throw new ClassCastException("不是Student对象");
Student stu = (Student) ob;
return this.name.equals(stu.getName()) && this.age == stu.getAge();
}
// 覆写CompareTo方法 先比较年龄,然后比较姓名
public int compareTo(Student stu) {
int num = this.age - stu.age;
if (num == 0) {
return this.name.compareTo(stu.name);
}
return num;
}
*/
}
public class TreeMapDemo {
public static void main(String[] args) {
/* 定义HashMap,里面存储的是Student和地址 */
TreeMap<Student, String> map = new TreeMap<Student, String>(
new StuNameComparator());
map.put(new Student("java03", 23), "北京");
map.put(new Student("net02", 21), "上海");
map.put(new Student("net02", 26), "厦门");
map.put(new Student("net03", 26), "广州");
map.put(new Student("java01", 24), "南京");
map.put(new Student("java01", 22), "天津");
map.put(new Student("net03", 26), "广州");
Set<Student> set = map.keySet();
Iterator<Student> it = set.iterator();
while (it.hasNext()) {
Student stu = it.next();
String name = stu.getName();
int age = stu.getAge();
String address = map.get(stu);
System.out.println(name + ":" + age + ":" + address);
}
}
}
复制代码
作者:
雨过丶天已晴
时间:
2013-10-28 10:11
本帖最后由 雨过丶天已晴 于 2013-10-29 13:30 编辑
其实可以通过查看TreeMap的帮助文档来回答第一个问题,文档中有四个构造方法,
第一个:通过空参数构造,目的是自然排序,那计算机到底怎么自然排序呢,肯定是实现Comparable接口
第二个:需要传入一个实现Comparator接口的参数,根据指定比较器排序
所以第一个答案是肯定的
对于第二问,我觉得要明确两个问题
1、把Map中的key是不能重复的,把Map中key全部集中起来,就组成了一个Set集合
2、其实Map集合,本质上是一个关联数组,换个简单的角度理解Map中key与value的关系,可以看做value是key的附属物,
因此,楼主的第二问,就迎刃而解了,key是关键所在,而key又不能重复,所以HashMap中的元素的Key是需要去重写equals(),hashCode(),保证唯一性的。
所以两个答案都是肯定的。
前面发了一次这个帖子,自己搞错了,希望楼主见谅,以前以为Map的底层是Set维护,可是昨天看源码才发现,Set集合是靠Map维护的,特来改正。
希望对楼主有所帮助,错误之处,大家多多指正
作者:
To
时间:
2013-10-29 21:28
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:
http://bbs.itheima.com/thread-89313-1-1.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2