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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程序爱好者 中级黑马   /  2014-4-12 21:41  /  1230 人查看  /  13 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程序爱好者 于 2014-4-14 21:53 编辑
  1. import java.util.*;
  2. public class Test {
  3.         public static void main(String[] args) {
  4.                 ArrayList ar=new ArrayList();        
  5.                 ar.add(new Dome("张三",18));               
  6.                 ar.add(new Dome("李四",19));               
  7.                 ar.add(new Dome("李四",19));               
  8.                 ar.add(new Dome("王五",20));        
  9.                 Iterator i=ar.iterator();        
  10.                 ar=sings(ar);
  11.                 while(i.hasNext())
  12.                 {
  13.                         Dome d=(Dome)i.next();        
  14.                         sop("姓名:"+d.getName()+",年龄:"+d.getAgs());
  15.                 }        
  16.         }
  17.         public static ArrayList sings(ArrayList a1)
  18.         {        
  19.                 ArrayList ar=new ArrayList();
  20.                 Iterator i=a1.iterator();
  21.                 while(i.hasNext())
  22.                 {
  23.                         Object obj=i.next();
  24.                         if (!ar.contains(obj)) {
  25.                                 ar.add(obj);
  26.                         }
  27.                 }
  28.                 return ar;
  29.         }
  30.         public static void sop(Object obj)
  31.         {
  32.                 System.out.println(obj);
  33.         }
  34. }


  35. public class Dome {
  36.         private String name;
  37.         private int ags;
  38.         public Dome(String name,int ags)
  39.         {
  40.                 this.name=name;
  41.                 this.ags=ags;
  42.         }
  43.         public String getName()
  44.         {
  45.                 return name;
  46.         }
  47.         public int getAgs()
  48.         {
  49.                 return ags;
  50.         }
  51.         public boolean equals(Object obj)
  52.         {
  53.                 if (!(obj instanceof Dome)) {
  54.                         return false;
  55.                 }
  56.                 Dome d=(Dome)obj;
  57.                 return this.name.equals(d.name)&&this.ags==d.ags;
  58.         }
  59. }
复制代码

纠结了很久  看着视频打都打错了  找也找不出答案  怎么还打出重复代码
姓名:张三,年龄:18
姓名:李四,年龄:19
姓名:李四,年龄:19
姓名:王五,年龄:20

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

13 个回复

倒序浏览
你使用的容器是ArrayList,它是List的子类
List类或者子类集合中元素的特点是:有序,可重复,有序指的打印顺序和存放顺序相同
Set类或者子类集合元素的特点是无序,不可重复,通常就是HashSet和TreeSet,前者为了保证元素不重复,必须复写hashCode()方法和equals方法   后者必须实现Comparable接口和复写equals方法  
你既然使用了ArrayList集合,那么当然可以放入相同的元素啊      还有就是程序中是不需要复写equals方法
你估计是看错视频了把   你在好好看看原视频!!

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
因为你用的是ArrayList
回复 使用道具 举报
caijunsong 发表于 2014-4-12 22:10
你使用的容器是ArrayList,它是List的子类
List类或者子类集合中元素的特点是:有序,可重复,有序指的打印 ...

谢谢你的回答!  不过视频确实是ArrayList也可以打印不重复代码, 不知道哪里出了问题
回复 使用道具 举报
你使用的集合是 ArrayList

它是允许许集合中有重复元素的,

它内部封装了数组,是通过角标来排序的排序,所以它是有序的,同时允许元素重复!

想让元素不重复,就使用 Set集合来存储!

通过复写 hashCode 、equals、compareTo 这些方法来确定元素的唯一性!

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
ar = sings(ar);
Iterator i = ar.iterator();
兄弟这两句交换下位置就对了
回复 使用道具 举报

  1. 老毕的思路是弄了一个方法,在方法之中,定义了一个临时的集合ArrayList,我们先把元素放入一个事先创建的
  2. 集合之中 ,这个集合可以重复元素,然后我们通过人为干预去除重复元素  在临时集合中通过contains来阻挡重复的元素   contains判断元素是否重复 是调用了存放对象的equals让集合中的每个元素作为参数进行比较判断

  3. 毕老师的代码:
  4.                 al.add("java01");//老毕放入的元素是String,java02和java02我们知道两者用等于号比较时返回的是true
  5.                 al.add("java02");
  6.                 al.add("java01");
  7.                 al.add("java02");
  8.                 al.add("java01");
  9.      while(it.hasNext())
  10.                 {
  11.                         Object obj = it.next();

  12.                         if(!newAl.contains(obj))//这里将调用obj的equals方法?obj是什么类型啊,Object类型
  13.                                                 //Object类的equals比较对象是判断什么??和等号一样,判断的是哈希值
  14.                                                                  //假如java01已经放进去了,再次要放java01,,你说这里的equals能让它进去吗
  15.                                 newAl.add(obj);

  16.                 }

  17. 你的代码
  18.         ArrayList ar=new ArrayList();        

  19.                 ar.add(new Dome("张三",18));               

  20.                 ar.add(new Dome("李四",19));               

  21.                 ar.add(new Dome("李四",19));               

  22.                 ar.add(new Dome("王五",20));        

  23.                 Iterator i=ar.iterator();   
  24.                  while(i.hasNext())

  25.                 {

  26.                         Object obj=i.next();

  27.                         if (!ar.contains(obj)) {

  28.                                 ar.add(obj);

  29.                         }

  30.                 }
  31.                                 //在你的代码之中虽然复写了equals,但是你在比较的时候依然调用的还是
  32.                                 //Object的,比较哈希值,你定义了两个不同的Demo对象,哈希值肯定不同,只是这两个对象的内容一样
  33.                                 //也就是说程序没有按照你想的通过比较内容来阻止相同元素,而是通过了哈希值
  34.                 //我本想通过强制转换,来调用Demo复写的equals,但是不知道为什么出现了一个编译错误,涉及到内部类,我没找出来
  35.    
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
程序爱好者 发表于 2014-4-12 22:33
谢谢你的回答!  不过视频确实是ArrayList也可以打印不重复代码, 不知道哪里出了问题 ...

我第一次回答的的确不对 我第二次答的你应该会有所启发
如有不懂 交个朋友吧  752541086  多交流
回复 使用道具 举报
caijunsong 发表于 2014-4-12 23:37
我第一次回答的的确不对 我第二次答的你应该会有所启发
如有不懂 交个朋友吧  752541086  多交流 ...

好的 呵呵
回复 使用道具 举报
ArrayList 与HashSet 去除重复函数的 区别 equals
  1. package day14;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;

  4. /*
  5. 将自定义对象作为元素存到ArrayList集合中,并去除从父元素。
  6. 比如:存人对象。同姓名同年龄,视为同一个人,为重复元素。

  7. 思路:
  8. 1,对人的描述,将数据封装进人对象。
  9. 2,定义容器,将人存入。
  10. 3,取出


  11. 结论 List 集合判断元素是否相同 ,依据的是元素equals方法
  12. */


  13. //人的描述  类
  14. class Person{
  15.         private String name;
  16.         private int age ;
  17.        
  18.        
  19.         //构造器
  20.         Person(String name, int age){
  21.                 this.name = name;
  22.                 this.age = age;
  23.                 }
  24.         public boolean equals(Object obj){
  25.                
  26.                
  27.                 if(!(obj instanceof Person))
  28.                         return false;
  29.                        
  30.                         Person p = (Person)obj;
  31.                         System.out.println(this.name+";;;;;;"+p.name);
  32.                        
  33.                         return this.name.equals(p.name)&&this.age==p.age;
  34.                 }
  35.         //获取
  36.         public String getName(){
  37.                 return name;
  38.                
  39.         }
  40.        
  41.         public int getAge(){
  42.                 return age;
  43.                
  44.         }
  45.        
  46. }


  47. public class ArrayListTest2 {

  48.         public static void sop(Object obj){
  49.                 System.out.println(obj);
  50.         }
  51.         public static void main(String[] args) {
  52. //定义一个 集合容器
  53.                 ArrayList al = new ArrayList();
  54.                
  55.                 //外部 描述类  给容器添加   元素的格式〉〉〉〉〉〉〉〉找 构造器
  56.                 al.add(new Person("lisi01", 30));
  57.                 al.add(new Person("lisi02", 32));
  58.                 al.add(new Person("lisi02", 32));
  59.                 al.add(new Person("lisi03", 33));
  60.                 al.add(new Person("lisi04", 32));
  61.                 al.add(new Person("lisi04", 32));
  62.                 al.add(new Person("lisi05", 35));
  63.                
  64.                 al = singleElment( al);
  65.                 //遍历取出
  66.                 Iterator it = al.iterator();
  67.                 while(it.hasNext()){
  68.                         //因为a1.add(Object obj);
  69.                         //Object obj = new Person("lisi01",30);   返回值提升了 为Object
  70.                         Person        p=(Person)it.next();//〉〉〉〉〉〉所以要强转
  71.                         sop(p.getName()+",,,,,"+p.getAge());
  72.                 }
  73.                
  74.                
  75.         }
  76.         //唯一元素的 方法
  77.         public static ArrayList singleElment(ArrayList a1){
  78.                 //定义一个临时容器
  79.                 ArrayList newA1 = new ArrayList();
  80.                 //遍历老集合
  81.                 Iterator it =a1.iterator();
  82.                
  83.                 while (it.hasNext()){
  84.                         Object obj = it.next();//为什么要obj一下呢????  拿下一个元素用obj记下来
  85.                         //判断一下   如果不包含下面的一个元素  就往容器集合里面添加元素
  86.                         if(!newA1.contains(obj))//——————————————————————List---中用contains内部调用equals
  87.                                 newA1.add(obj);
  88.                        
  89.                 }
  90.                 return newA1;
  91.         }
  92.        

  93. }
复制代码



  1. package day14;

  2. import java.util.HashSet;
  3. import java.util.Iterator;

  4. /*王hashset集合中存入自定义对象
  5. 姓名和年龄视为同一个人,重复元素*/



  6. /*HashSet 和Arraylisht 中 equals的区别 〉〉〉〉〉〉〉〉〉〉〉〉〉???????
  7.                   首先Set存储时无序不可重复的,List是有序可重复的
  8.                 List---中用contains内部调用equals
  9.                 Set----中使用的equals方法是其存入的类(Person或其他)的重写的equals,hashCode方法*/
  10. public class HashSetTest {

  11.         public static void sop(Object obj){
  12.                 System.out.println(obj);
  13.         }

  14.         public static void main(String[] args) {
  15.                 HashSet hs = new HashSet();
  16.                
  17.                 hs.add(new Person("a1",11));
  18.                 hs.add(new Person("a2",12));
  19.                 hs.add(new Person("a3",13));
  20.                 hs.add(new Person("a4",14));
  21.                 hs.add(new Person("a1",11));
  22.                 hs.add(new Person("a2",13));
  23.                
  24.                 Iterator it =hs.iterator();
  25.                
  26.                 while(it.hasNext()){
  27.                         Person        p=(Person)it.next();//〉〉〉〉〉〉所以要强转>>>>看ArrayListTest2
  28.                         sop(p.getName()+",,,,,"+p.getAge());
  29.                 }
  30.         }

  31. }
  32. class Person{
  33.         private String name;
  34.         private int age ;
  35.        
  36.        
  37.         //构造器
  38.         Person(String name, int age){
  39.                 this.name = name;
  40.                 this.age = age;
  41.                 }
  42.        
  43.         public int hashCode(){
  44.                 //验证
  45.                 System.out.println(this.name+".....hashCode");
  46.                
  47.                 //return 60;
  48.                 //为提高效率 返回name.hashCode()+age;
  49.                 //return name.hashCode()+age;  20+30=30+20  总hash值有可能相同   为了尽量保持返回的哈希值 唯一性    随便乘以一个数
  50.                 return name.hashCode()+age*39;
  51.         }
  52.         //hashset  判断
  53.         public boolean equals(Object obj){
  54.                
  55.                
  56.                 if(!(obj instanceof Person))
  57.                         return false;
  58.                        
  59.                         Person p = (Person)obj;
  60.                         System.out.println(this.name+";;;equals;;;"+p.name);
  61.                        
  62.                         return this.name.equals(p.name)&&this.age==p.age;
  63.                 }
  64.         //获取
  65.         public String getName(){
  66.                 return name;
  67.                
  68.         }
  69.        
  70.         public int getAge(){
  71.                 return age;
  72.                
  73.         }
  74.        
  75. }
复制代码
回复 使用道具 举报
luoyilan222 发表于 2014-4-12 23:07
ar = sings(ar);
Iterator i = ar.iterator();
兄弟这两句交换下位置就对了

:handshake    太感谢了  我看了好久都没看出来
回复 使用道具 举报
回复 使用道具 举报
加油!!! 呵呵 不谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马