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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM周磊 中级黑马   /  2013-3-28 16:55  /  1650 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM周磊 于 2013-3-28 19:58 编辑
  1. package doy16;
  2. import java.util.*;

  3. //一般定义一个类,都要按一个顺序排列。
  4. class XueSheng implements Comparable<XueSheng>
  5. {
  6. private String name;
  7. private int age;

  8. XueSheng(String name,int age)
  9. {
  10. setName();
  11. setAge();
  12. }

  13. public String setName()
  14. {
  15. return this.name = name;
  16. }
  17. public int setAge()
  18. {
  19. return this.age = age;
  20. }

  21. //对元素进行自然顺序排列。
  22. public int compareTo(XueSheng xs)
  23. {
  24. int num = new Integer(this.age).compareTo(new Integer(xs.age));
  25. if (num==0)
  26. return this.setName().compeareTo(xs.setName());
  27. return num;
  28. }

  29. //考虑到该类产生的事物很多,可能存在哈希表里,故应该建立一个方法,保证元素唯一。
  30. public int hashCode()
  31. {
  32. return name.hashCode()+age*4;//自定义哈希返回值:名字加年龄成了一个整体。
  33. }
  34. public boolean equals(Object obj)
  35. {
  36. if (!(obj instanceof XueSheng))
  37. throw new ClassCastException("传错了类型对象");
  38. XueSheng xs = (XueSheng)obj;

  39. return this.name.equals(xs.name) && this.age==xs.age;

  40. }


  41. public String getName()
  42. {
  43. return name;
  44. }
  45. public int getAge()
  46. {
  47. return age;
  48. }

  49. public String toString()
  50. {
  51. return name+age;
  52. }
  53. }

  54. class MapLianxi1
  55. {
  56. public static void main(String[] args)
  57. {
  58. HashMap<XueSheng,String> xs =new HashMap<XueSheng,String>();
  59. xs.put(new XueSheng("拉拉",11),"江西");
  60. xs.put(new XueSheng("呵呵",21),"深圳");
  61. xs.put(new XueSheng("嘻嘻",31),"杭州");
  62. xs.put(new XueSheng("你妹",41),"上海");

  63. //第一种取出方式:keySet();
  64. Set<XueSheng> keyset = xs.keySet();
  65. for (Iterator<XueSheng> iter =keyset.iterator();iter.hasNext();)
  66. {
  67. XueSheng xu = iter.next();
  68. String dizi = xs.get(xu);
  69. System.out.println(xu+"----"+dizi);
  70. }


  71. }
  72. }
复制代码
30行为什么会报错?
compeareTo()方法传入的是对象,我在构造函数里传入的是获取对象的方法。这时,怎么往compeareTo传入对象呢?

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
return this.setName().compeareTo(xs.setName());
应该是this.getName()你写错了。
回复 使用道具 举报
本帖最后由 HM周磊 于 2013-3-28 17:33 编辑
陈圳 发表于 2013-3-28 17:06
return this.setName().compeareTo(xs.setName());
应该是this.getName()你写错了。
楼上威武,一语惊醒梦中人啊!!!但是,编译没问题了,运行却报了错!!


我命怎么怎么苦!!!

QQ截图20130328172333.png (4.35 KB, 下载次数: 6)

QQ截图20130328172333.png
回复 使用道具 举报
HM周磊 发表于 2013-3-28 17:24
楼上威武,一语惊醒梦中人啊!!!但是,编译没问题了,运行却报了错!!

你的真是太麻烦了。
我真看了你的需求,然后我回故了一下HashMap.这里实现类的比较性没有作用。带Tree的集合才需要。
  1. package day1;

  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Map.Entry;

  5. public class Program5 {

  6.         /**
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 HashMap<Student,String> personList=new HashMap<Student,String>();
  12.                 personList.put(new Student("Tom",21), "上海");
  13.                 personList.put(new Student("Jack",21), "北京");
  14.                 personList.put(new Student("kity",25), "南京");
  15.                 personList.put(new Student("Boky",19), "武汉");
  16.                 personList.put(new Student("Boky",19), "武汉");
  17.                 for(Object obj:personList.entrySet()){
  18.                         Map.Entry<Student, String> me=(Map.Entry<Student, String>)obj;
  19.                         System.out.println(me.getKey()+":"+me.getValue());
  20.                 }
  21.         }

  22. }
  23. class Student
  24. {
  25.         private String name;
  26.         private int age;
  27.         public Student(String name, int age) {
  28.                 super();
  29.                 this.name = name;
  30.                 this.age = age;
  31.         }
  32.         public String getName() {
  33.                 return name;
  34.         }
  35.         public void setName(String name) {
  36.                 this.name = name;
  37.         }
  38.         public int getAge() {
  39.                 return age;
  40.         }
  41.         public void setAge(int age) {
  42.                 this.age = age;
  43.         }
  44.         @Override
  45.         public int hashCode(){
  46.                 System.out.println("come to hashCode");
  47.                 return 1;
  48.         }
  49.         /*@Override
  50.         public boolean equals(Object obj){
  51.                 System.out.println("come to equals");
  52.                 if(!(obj instanceof Student))
  53.                         throw new RuntimeException();
  54.                 Student stu=(Student)obj;
  55.                 return this.name.contains(stu.name);
  56.         }*/
  57. //        @Override
  58. //        public int compareTo(Student o) {
  59. //                int num=o.age-this.age;
  60. //                if(num==0)
  61. //                        return this.name.compareTo(o.name);
  62. //                return num;
  63. //        }
  64.         public String toString(){
  65.                 return this.name+":"+this.age;
  66.         }
  67. }
  68.   
复制代码

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 张豪杰 于 2013-3-28 17:51 编辑

你方法定义的有问题
先从你的构造函数开始
XueSheng(String name,int age)
{
setName();  //你构造函数传入了一个name,和一个age,但是这两个传入的值,完全没有用到,你只是简单的调用了setName和setAge方法而已,并没有对其进行赋值
setAge();   //这明显逻辑上就有错误了,就算编译通过了,你也没有为学生对象赋值姓名和年龄!
}
然后是你两个set方法的问题:
public String setName()
{
return this.name = name;//左边的name是对象名.name,实质上是类的成员,也就是你开头定义的private String name;
                                    //右边的name,在你这个方法里,实际上也是private String name。
                                    //你这个方法就相当于是return this.name = this.name;或者是return name = name
}
public int setAge()
{
return this.age = age;//解释同上
}

你连传递给函数的临时变量,和类的实例变量,两者的区别都没有搞清楚-。-

可以构造行数改成下面那样
xuesheng(String name,int age)
{
setName(name);//将传入构造函数中的临时变量传递给set方法
setAge(age);
}
两个set方法改成
public String setName(String name){ retrun this.name = name;//将接收到的临时变量传递给类的实例变量}
public int setAge(int age){ return this.age = age;//同上}

这样的代码,逻辑上才没有错误。注意,仅仅是逻辑上没有错误,实际上,谁会写这么粗糙的代码
首先,你明明定义了两个实例变量private String name和private int age,这个在构造函数里直接赋值就行,你偏偏要去调用两个set方法
这感觉,就跟明明你家里就有水龙头可以装水,你偏偏要跑去河边去担水回来一般
所以构造函数可以这样写
XueSheng(String name,int age){this.name = name; this.age = age;}
然后是两个set方法,你开头的两个set方法是空参数的,你这样怎么让计算机进行赋值?这就好比,你跟别人说,你按照我的图纸建房子,可是你图纸都不给人家-。-
还有,set方法通常不需要返回值(注意是普通情况下,不是所有情况),因为它的作用仅仅是对对象的属性进行设置,你给个返回值,大多情况下也用不上!
所以两个set方法可以写成
public void setName(String name){ this.name = name;//将接收到的临时变量传递给实例变量}
public void setAge(int age){this.age = age;}

你先改改你的构造函数和set方法再运行试试
不行的话,再继续问题

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 HM周磊 于 2013-3-28 20:11 编辑
张豪杰 发表于 2013-3-28 17:49
你方法定义的有问题
先从你的构造函数开始
XueSheng(String name,int age)


谢谢,感觉明白多了。运行ok了,非常感谢!!!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马