黑马程序员技术交流社区

标题: 有个ArrayList问题 求教大神解答 [打印本页]

作者: kira    时间: 2014-1-25 18:35
标题: 有个ArrayList问题 求教大神解答
本帖最后由 kira 于 2014-1-26 10:59 编辑

需求是我现在实现一个去除ArrayList重复元素的功能
LZ我写了一个 却发现 去到的是null这到底是怎么回事{:soso_e101:}

代码如下

  1. import java.util.ArrayList;
  2. import java.util.ListIterator;

  3. public class DelectDemo {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 ArrayList al1 = new ArrayList();
  10.                 al1.add("java01");
  11.                 al1.add("java02");
  12.                
  13.                 al1.add("java01");
  14.                 System.out.println(al1);
  15.                 System.out.println(singlelement(al1));
  16.                
  17.         }
  18.         public static ArrayList singlelement(ArrayList al){//这个是我添加的功能
  19.                
  20.                 ArrayList all = new ArrayList();
  21.                
  22.                 for(ListIterator ll = all.listIterator();ll.hasNext();){
  23.                         Object o = ll.next();
  24.                         if(!all.contains(o)){
  25.                                 
  26.                                 ll.add(o);
  27.                                 
  28.                         }
  29.                 }
  30.                
  31.                 return all;//返回的是新调用的ArrayList
  32.                
  33.                
  34.         }
  35.         
  36.                         

  37. }
复制代码
结果发现打印为null 这个不科学啊
到底是哪个方面出了问题呢 求大神解答



作者: 李跃峰    时间: 2014-1-25 18:46
public static ArrayList singlelement(ArrayList al){//这个是我添加的功能
               
                ArrayList all = new ArrayList();
               
                for(ListIterator ll = all.listIterator();ll.hasNext();){
                        Object o = ll.next();
                        if(!all.contains(o)){
                              
                                ll.add(o);
                              
                        }
                }
               
                return all;//返回的是新调用的ArrayList
               
               
        }

你这个方法返回的永远是一个null的ArrayList啊。。。。
你传进去的ArrayList al根本没用到啊。。。而是在里面新建了一个空的ArrayList,
for(ListIterator ll = all.listIterator();ll.hasNext();){而你这个判断是说,当迭代器有元素可以迭代就进入循环,但是你ListIterator ll = all.listIterator()实际上永远是个空的迭代器。。所以永远不进循环。。自然返回的是你新建的空的集合,那打印出来自然也是空了。。
作者: kira    时间: 2014-1-25 20:14
李跃峰 发表于 2014-1-25 18:46
public static ArrayList singlelement(ArrayList al){//这个是我添加的功能
               
             ...

但我还是纳闷了  如果说返回的永远是null的话
但毕老师这里却也是new了一个新容器 返回的确实是 不重复元素的集合 而不是空
我实在想不明白 结果我把for写法 换成了while效果还是没解决 :'(
作者: kira    时间: 2014-1-25 20:18
李跃峰 发表于 2014-1-25 18:46
public static ArrayList singlelement(ArrayList al){//这个是我添加的功能
               
             ...

还有就是我换成了ListIterator ll = al.listIterator(); 调用后运行还是空的 这。。。:'( 不科学啊
作者: 李跃峰    时间: 2014-1-25 23:08
这有好多种返回值,不知道你要哪种,我看了看,你是想去重是吧,这样就可以,把下面的singlelement方法改成我这个

  1.   public static ArrayList singlelement(ArrayList al){//这个是我添加的功能
  2.                
  3.                ArrayList all = new ArrayList();
  4.                
  5.                 for(ListIterator ll = al.listIterator();ll.hasNext();){
  6.                         Object o = ll.next();
  7.                         if(!all.contains(o)){
  8.                                 
  9.                                 all.add(o);
  10.                                 
  11.                         }
  12.                 }
  13.                
  14.                 return all;//返回的是新调用的ArrayList
  15.                
  16.                
  17.         }
复制代码

作者: 李跃峰    时间: 2014-1-25 23:10
kira 发表于 2014-1-25 20:18
还有就是我换成了ListIterator ll = al.listIterator(); 调用后运行还是空的 这。。。 不科学啊 ...

你看看是不是你想要的结果
作者: 山治0712    时间: 2014-1-26 00:47
你的singlelement方法中ArrayList all = new ArrayList();把al1对象的引用地址覆盖了,建议换个名字,而且循环也是无效的,因为al1是空
作者: zhangchao    时间: 2014-1-26 00:50
kira 发表于 2014-1-25 20:14
但我还是纳闷了  如果说返回的永远是null的话
但毕老师这里却也是new了一个新容器 返回的确实是 不重复元 ...

毕老师新new的新容器没装数据?你肯定没看清楚。
public static ArrayList singlelement(ArrayList al){//这个是我添加的功能
               
                //ArrayList all = new ArrayList();
                ArrayList all = al;
               
                for(ListIterator ll = all.listIterator();ll.hasNext();){
                        Object o = ll.next();
                        if(!all.contains(o)){
                              
                                ll.add(o);
                              
                        }
                }
               
                return all;//返回的是新调用的ArrayList
               
               
        }
试试我改的行不?
作者: kira    时间: 2014-1-26 10:54
李跃峰 发表于 2014-1-25 23:10
你看看是不是你想要的结果

中了! 这不科学:o 我研究下究竟有哪里不一样
作者: kira    时间: 2014-1-26 10:57
zhangchao 发表于 2014-1-26 00:50
毕老师新new的新容器没装数据?你肯定没看清楚。
public static ArrayList singlelement(ArrayList al){/ ...

:L 你这个功能没用 话说你这个错的有点离谱
作者: kira    时间: 2014-1-26 10:58
山治0712 发表于 2014-1-26 00:47
你的singlelement方法中ArrayList all = new ArrayList();把al1对象的引用地址覆盖了,建议换个名字,而且 ...

1和l的名字的确不太好 前面问了方便 结果后面反而不方便了:lol 我下次会留心
作者: zhangchao    时间: 2014-1-26 15:30
kira 发表于 2014-1-26 10:57
你这个功能没用 话说你这个错的有点离谱

先谢了
public static ArrayList singlelement(ArrayList al){//这个是我添加的功能
               
                ArrayList all = new ArrayList();
               //楼主应该是把al 笔误写成all了
              //  for(ListIterator ll = all.listIterator();ll.hasNext();){
               for(ListIterator ll = al.listIterator();ll.hasNext();){
                        Object o = ll.next();
                        if(!all.contains(o)){
                              
                                ll.add(o);
                              
                        }
                }
               
                return all;//返回的是新调用的ArrayList
               
               
        }




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