A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 qinhaihang 于 2015-6-12 10:55 编辑

我的代码如下:
  1. package com.test;
  2. import java.util.*;

  3. class Student {
  4.         private String name;
  5.         private int age;
  6.        
  7.         public Student(String name, int age) {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }

  11.         public String getName() {
  12.                 return name;
  13.         }

  14.         public void setName(String name) {
  15.                 this.name = name;
  16.         }

  17.         public int getAge() {
  18.                 return age;
  19.         }

  20.         public void setAge(int age) {
  21.                 this.age = age;
  22.         }

  23.         @Override
  24.         public String toString() {
  25.                 return "Student [name=" + name + ", age=" + age + "]";
  26.         }
  27.                
  28. }


  29. public class Test4 {

  30.         public static void main(String[] args) {
  31.                 //Student stu = new Student("lisi", 20);
  32.                 //System.out.println(stu);
  33.                 //使用TreeMap可以传入比较器comparator
  34.                 TreeMap<String, Student> className = new TreeMap<String,Student>(new MyComparator());
  35.                
  36.                 //建立班级容器(唯一性出问题)
  37.                 className.put("class1",new Student("lisi",20));
  38.                 className.put("class1", new Student("qinhaihang",18));
  39.                 className.put("class2", new Student("haihangqin",19));
  40.                 className.put("class2", new Student("hanghaiqin",17));
  41.                
  42.                 //使用迭代器打印键值
  43.                 //将Map键存到Set集合中
  44.                 Set<String> keyset = className.keySet();
  45.                 Iterator<String> it = keyset.iterator();
  46.                 while(it.hasNext()){
  47.                         String key = it.next();
  48.                         Student value = className.get(key);
  49.                         System.out.println("Key:"+key+",Value:"+value);
  50.                 }               
  51.         }

  52. }
  53. class MyComparator implements Comparator<Object> {

  54.         @Override
  55.         public int compare(Object o1, Object o2) {
  56.                 String s1 = (String)o1;
  57.                 String s2 = (String)o2;
  58.                 int num = s1.compareTo(s2);
  59.                 if(num==0){
  60.                         num=-1;
  61.                 }
  62.                 return num;
  63.         }
  64.        
  65. }
复制代码
打印结果,key可以打印出来,但是value全是null。
求教大神啊,看看为什么会这样


3 个回复

正序浏览
本帖最后由 少年闰土 于 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的


回复 使用道具 举报
问题应该出在你的比较器上,你定义的比较器比较的是Student对象,但却用来比较Map中的元素(键与值成对),应该在比较器里把Map元素中的Student对象提取出来再比较
回复 使用道具 举报
Student s1和 Student s2无法比较,返回空
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马