黑马程序员技术交流社区

标题: 集合问题 [打印本页]

作者: 程序爱好者    时间: 2014-4-16 17:20
标题: 集合问题
本帖最后由 程序爱好者 于 2014-4-16 19:45 编辑

import java.util.*;
public class Dome {
        public static void main(String[] args) {
                TreeMap<Student,String> tm=new TreeMap<Student,String>(new com());
                tm.put(new Student("张三",19), "北京");
                tm.put(new Student("李四",20), "上海");
        //        map.put(new Student("王五",25), "深圳");
                tm.put(new Student("王五",25), "深圳");
                tm.put(new Student("赵六",22), "北海");
                Set<Map.Entry<Student,String>> s=tm.entrySet();
                Iterator<Map.Entry<Student, String>> en=s.iterator();
                while(en.hasNext())
                {
                        Map.Entry<Student,String> kry=en.next();
                        Student key=kry.getKey();
                        String value=kry.getValue();
                        System.out.println(key+":"+value);
                }
        }
}

import java.util.*;
public class Student implements Comparable<Student> {
        private String name;
        private int age;
        public int compareTo(Student s)
        {
        //        Student s=(Student)o;
                int num=new Integer(this.age).compareTo(new Integer(s.age));
                if (num==0) {
                        return this.name.compareTo(s.name);
                }
                return num;
        }
        public Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
        public int hashCode()
        {
                return name.hashCode()+age*37;
        }
        public boolean equals(Object obj)
        {
                if (! (obj instanceof Student)) {
                        throw new ClassCastException("类型不匹配");
                }
                Student s=(Student)obj;
                return this.name.equals(s.name)&&this.age==s.age;
        }

}

import java.util.*;
public class com implements Comparator<Student>{
        public int compare(Student s1,Student s2)
        {
                int num=s1.getName().compareTo(s2.getName());
                if (num==0) {
                        return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
                }
                return num;
        }
}

结果是:
map.lianxi.Student@bd5a8:北京
map.lianxi.Student@cdc31:上海
map.lianxi.Student@e5006:深圳
map.lianxi.Student@1175c6:北海

为什么会这样  不是想象中的那样  前面是姓名年龄后面是地址。怎么好像出现乱码

作者: 月光海    时间: 2014-4-16 17:30
老师的Student类里面应该该有一个toString方法的,需要覆写,里面返回的是学生的具体信息
  1. public String toSring()
  2.         {
  3.                 return "student["+name+", "+ma+", "+cn+", "+en+"]";
  4.         }
复制代码
刚刚那个帖子也是你发的?????
作者: xtxiaolu    时间: 2014-4-16 18:00
本帖最后由 xtxiaolu 于 2014-4-16 18:02 编辑

不是乱码!他是变量地址,也就是说你没有指向Student里面的getName和getAge
public class person {
        private String name;
        private int age;
        public person() {
                super();
        }
        public person(String name, int age) {
                super();
                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 "person [name=" + name + ", age=" + age + "]";
        }
       
}


作者: ⒈心只霸占沵    时间: 2014-4-16 18:06
  1.   Map.Entry<Student,String> kry=en.next();
  2.                          Student key=kry.getKey();
  3.                          String value=kry.getValue();
  4.                          System.out.println(key+":"+value);
复制代码

看一下你while中的代码   key 的类型是Student
     1 如果你想打印的详细些  可以写成
         System.out.println("姓名:"+key.getName()+"  年龄"+key.getAge()+“:”+value);
     2 你可以重写Student类的toString()方法 打印key是会默认调用toString方法
      
  1. public String toString(){
  2.     return "姓名:"+this.name+" 年龄:"+this.age;
  3. }  
复制代码

作者: 也许依然    时间: 2014-4-16 19:09
获得的key是Student对象,要打印名字和年龄需要用到getName()和getAge()

代码如下
  1. public class TreeMapDemo {

  2.         public static void main(String[] args) {
  3.                
  4.                 TreeMap<Student,String> tm = new TreeMap<Student,String>(new myComparator());
  5.                
  6.                 tm.put(new Student("zhangsan",21),"北京");
  7.                 tm.put(new Student("lisi",22),"天津");
  8.                 tm.put(new Student("wangwu",23),"上海");
  9.                 tm.put(new Student("zhaoliu",24),"广州");
  10.                
  11.                 Iterator<Map.Entry<Student, String>> it = tm.entrySet().iterator();
  12.                
  13.                 while(it.hasNext()){
  14.                         Map.Entry<Student,String> me = it.next();
  15.                         Student stu = me.getKey();
  16.                         String address = me.getValue();
  17.                         System.out.println(stu.getName()+" "+stu.getAge()+" "+address);
  18.                 }               
  19.         }
  20. }

  21. class Student implements Comparable<Student>{
  22.         private String name;
  23.         private int age;
  24.        
  25.         Student(String name,int age){
  26.                 this.name = name;
  27.                 this.age = age;
  28.         }
  29.        
  30.         public int compareTo(Student stu){
  31.                 int num = new Integer(this.age).compareTo(new Integer(stu.age));
  32.                 if(num==0)
  33.                         return this.name.compareTo(stu.name);
  34.                 return num;
  35.         }
  36.        
  37.         @Override
  38.         public int hashCode(){
  39.                 return this.name.hashCode()+this.age*39;
  40.         }
  41.        
  42.         @Override
  43.         public boolean equals(Object obj){
  44.                 if(!(obj instanceof Student))
  45.                         throw new RuntimeException("类型不匹配");
  46.                 Student s = (Student)obj;
  47.                 return this.name.equals(s.name) && this.age == s.age;
  48.         }

  49.         public String getName() {
  50.                 return name;
  51.         }

  52.         public void setName(String name) {
  53.                 this.name = name;
  54.         }

  55.         public int getAge() {
  56.                 return age;
  57.         }

  58.         public void setAge(int age) {
  59.                 this.age = age;
  60.         }
  61.        
  62.         @Override
  63.         public String toString(){
  64.                 return name+"  "+age;
  65.         }
  66. }

  67. //定义比较器
  68. class myComparator implements Comparator<Student>{
  69.         public int compare(Student s1,Student s2){
  70.                 int num=s1.getName().compareTo(s2.getName());
  71.         if (num==0) {
  72.                 return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  73.         }
  74.         return num;
  75.         }
  76. }
复制代码

作者: 程序爱好者    时间: 2014-4-16 19:42
月光海 发表于 2014-4-16 17:30
老师的Student类里面应该该有一个toString方法的,需要覆写,里面返回的是学生的具体信息刚刚那个帖子也是 ...

我就发这一次吧?难道点到两次了?  挺你的加了这句就对了   谢谢了
作者: 清风夜独醉    时间: 2014-4-16 19:46
Map集合中的key代表的是Student对象,如果直接打印key得到的是Student对象的地址值,就是你看到结果。
如果想要打印出你想要的结果有两种方法:
一种是复写Student类中的toString()方法,返回你想要的结果。"person [name=" + name + ", age=" + age + "]"
另一种就是调用getName()和getAge()方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2