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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© .Mr 中级黑马   /  2013-12-5 22:47  /  1546 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 .Mr 于 2013-12-6 16:41 编辑

为什么老毕打印的是[lisi1:21,lisi1:22,lisi1:23,lisi1:24,lisi1:22,lisi1:23]
下面程序的打印部分是我要问的问题,因为这边打印内容都是使用迭代器来完成的,这里老师却直接打印处了内容,我打印出来是地址值,我思考是不是我的Person类中的问题,帮忙解答一下,谢谢
public static void main(String[] args) {                        
                ArrayList al = new ArrayList();
                al.add(new Person("lisi1",21));
                al.add(new Person("lisi2",22));
                al.add(new Person("lisi3",23));
                al.add(new Person("lisi4",24));
                al.add(new Person("lisi2",22));
                al.add(new Person("lisi3",23));
                System.out.println(al);  
               
                al = getSingleElement(al);   
               
                System.out.println(al.remove(new Person("lisi2",22)));
                System.out.println(al);
        
        }


        public static ArrayList getSingleElement(ArrayList al) {
               
                //1,定义一个临时容器。
                ArrayList temp = new ArrayList();
               
                //2,迭代al集合。
                Iterator it = al.iterator();
               
                while(it.hasNext()){
                        Object obj = it.next();
                        
                        //3,判断被迭代到的元素是否在临时容器存在。
                        if(!temp.contains(obj)){
                                temp.add(obj);
                        }
                }
               
                return temp;
        }
}

9 个回复

倒序浏览
这样的结果当然是打印地址,也忘了毕老师当时是怎么写打印出那个结果。
建议你用迭代显示吧:
  1.         for(Iterator<Person> it = al.iterator();it.hasNext();)
  2.         {
  3.                 Person p = it.next();
  4.                 System.out.println(p.getName()+":"+p.getAge());
  5.         }
复制代码
回复 使用道具 举报
这个程序随便怎么打 结果都是地址值 因为你要打印的是person对象 而不是具体person对象的姓名和年龄

要想打印出person对象的具体的姓名和年龄 就需要复写person类中的toString方法
比如在你的person类中加入
  1. public String toString(){
  2.      return name+":"+age;
  3. }
复制代码
回复 使用道具 举报
重写Person类里面的toString方法。
        @Override
        public String toString() {
                // TODO Auto-generated method stub
                return this.name + ":" + this.age;
        }
回复 使用道具 举报
你们回答都不全面,大家注意他的al.remove(new Person("lisi2",22))方法
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. class Person
  4. {
  5.         private String Person;
  6.         private int age;
  7.         @Override
  8.         public String toString()
  9.         {
  10.                 return this.Person+":"+this.age;
  11.         }
  12.         public Person(String person,int age)
  13.         {
  14.                 this.Person=person;
  15.                 this.age=age;
  16.         }
  17.         public String getPerson() {
  18.                 return Person;
  19.         }
  20.         public void setPerson(String person) {
  21.                 Person = person;
  22.         }
  23.         public boolean equals(Object obj)
  24.         {
  25.                 Person person=(Person)obj;       
  26.                 if(this.age==person.age&&this.Person!=null
  27.                 &&this.Person.equalsIgnoreCase(person.Person))
  28.                 return true;
  29.                 else
  30.                         return false;
  31.         }
  32.         public int getAge() {
  33.                 return age;
  34.         }
  35.         public void setAge(int age) {
  36.                 this.age = age;
  37.         }
  38. }
  39. public class fd
  40. {
  41.         public static void main(String[] args) {                       
  42.         ArrayList<Object> al = new ArrayList<Object>();
  43.         al.add(new Person("lisi1",21));
  44.         al.add(new Person("lisi2",22));
  45.         al.add(new Person("lisi3",23));
  46.         al.add(new Person("lisi4",24));
  47.         al.add(new Person("lisi2",22));
  48.         al.add(new Person("lisi3",23));
  49.         System.out.println(al);  
  50.       
  51.         al = getSingleElement(al);   
  52.       
  53.         System.out.println(al.remove(new Person("lisi2",22)));
  54.         System.out.println(al);

  55. }


  56. public static ArrayList getSingleElement(ArrayList al) {
  57.       
  58.         //1,定义一个临时容器。
  59.         ArrayList temp = new ArrayList();
  60.       
  61.         //2,迭代al集合。
  62.         Iterator it = al.iterator();
  63.       
  64.         while(it.hasNext()){
  65.                 Object obj = it.next();
  66.                
  67.                 //3,判断被迭代到的元素是否在临时容器存在。
  68.                 if(!temp.contains(obj)){
  69.                         temp.add(obj);
  70.                 }
  71.         }
  72.       
  73.         return temp;
  74. }

  75. }
复制代码

[lisi1:21, lisi2:22, lisi3:23, lisi4:24, lisi2:22, lisi3:23]
true
[lisi1:21, lisi3:23, lisi4:24]
回复 使用道具 举报
依然 发表于 2013-12-6 09:59
这样的结果当然是打印地址,也忘了毕老师当时是怎么写打印出那个结果。
建议你用迭代显示吧:
...

今天我看了下,其实去重写toString方法就行了。。谢谢啦
回复 使用道具 举报
.Mr 中级黑马 2013-12-6 16:40:29
7#
几番意难相付 发表于 2013-12-6 10:13
这个程序随便怎么打 结果都是地址值 因为你要打印的是person对象 而不是具体person对象的姓名和年龄

要想 ...

对的  哎 我没想到啊
回复 使用道具 举报
.Mr 中级黑马 2013-12-6 16:40:48
8#
┾——黑马 发表于 2013-12-6 10:15
重写Person类里面的toString方法。
        @Override
        public String toString() {

对的  哎 我没想到啊  谢谢啦
回复 使用道具 举报
.Mr 中级黑马 2013-12-6 16:40:59
9#
王家胜 发表于 2013-12-6 10:45
你们回答都不全面,大家注意他的al.remove(new Person("lisi2",22))方法

[lisi1:21, lisi2:22, lisi3:23,  ...

对的  哎 我没想到啊  谢谢啦
回复 使用道具 举报
对于引用型数据类型,使用System.out.println();打印这个类型的对象,会默认调用这个类型的toString();方法。如果没有复写的话,默认的就是打印地址值。如果想要看到自定义的信息,复写toString();方法就可以了。
在Person类中加入如下代码
  1. public String toString(){

  2.         return name+":"+age;

  3. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马