黑马程序员技术交流社区
标题:
TreeMap集合中怎么使用Comparator比较器呢?
[打印本页]
作者:
qinhaihang
时间:
2015-6-12 10:53
标题:
TreeMap集合中怎么使用Comparator比较器呢?
本帖最后由 qinhaihang 于 2015-6-12 10:55 编辑
我的代码如下:
package com.test;
import java.util.*;
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
public class Test4 {
public static void main(String[] args) {
//Student stu = new Student("lisi", 20);
//System.out.println(stu);
//使用TreeMap可以传入比较器comparator
TreeMap<String, Student> className = new TreeMap<String,Student>(new MyComparator());
//建立班级容器(唯一性出问题)
className.put("class1",new Student("lisi",20));
className.put("class1", new Student("qinhaihang",18));
className.put("class2", new Student("haihangqin",19));
className.put("class2", new Student("hanghaiqin",17));
//使用迭代器打印键值
//将Map键存到Set集合中
Set<String> keyset = className.keySet();
Iterator<String> it = keyset.iterator();
while(it.hasNext()){
String key = it.next();
Student value = className.get(key);
System.out.println("Key:"+key+",Value:"+value);
}
}
}
class MyComparator implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
String s1 = (String)o1;
String s2 = (String)o2;
int num = s1.compareTo(s2);
if(num==0){
num=-1;
}
return num;
}
}
复制代码
打印结果,key可以打印出来,但是value全是null。
求教大神啊,看看为什么会这样
作者:
itheima_llt
时间:
2015-6-12 12:30
Student s1和 Student s2无法比较,返回空
作者:
马也keyboard
时间:
2015-6-12 12:47
问题应该出在你的比较器上,你定义的比较器比较的是Student对象,但却用来比较Map中的元素(键与值成对),应该在比较器里把Map元素中的Student对象提取出来再比较
作者:
少年闰土
时间:
2015-6-12 20:02
本帖最后由 少年闰土 于 2015-6-12 20:10 编辑
class MyComparator implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
String s1 = (String)o1;
String s2 = (String)o2;
int num = s1.compareTo(s2);
if(num==0){
num=-1;
}
return num;
}
}
首先你的key是字符串,而字符串本身有它自己实现的copareable接口,也就是String类中有compareTo方法可以直接比较,不需要你写比较器。
再者,你的比较器中是对key值的比较,还是用了String的compareTo方法比较,功能重复了。
既然你写了比较器那就分析一下吧,在上面代码的第7行你是对key值的比较,按理比较的结果直接返回就可以了,你为什么要判断一下是否为0呢?由于你第8行将key值一样的情况改成了o1比o2小的结果(返回-1代表o1<o2),所以key值一样被你比较成不一样了,这样Map中就会将两个key值一样的键值对存起来,导致了你说的那个唯一性出问题。
由于比较器的原因导致你的Map中存入了key值一样的两个键值对,这个是没有问题的。
但是为什么取出value值为null,这个暂时还不知道具体原因,但是我将比较器该对的话是可以取出正确value的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2