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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kira 中级黑马   /  2014-1-25 18:35  /  1759 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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 这个不科学啊
到底是哪个方面出了问题呢 求大神解答


评分

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

查看全部评分

11 个回复

倒序浏览
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()实际上永远是个空的迭代器。。所以永远不进循环。。自然返回的是你新建的空的集合,那打印出来自然也是空了。。

评分

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

查看全部评分

回复 使用道具 举报
李跃峰 发表于 2014-1-25 18:46
public static ArrayList singlelement(ArrayList al){//这个是我添加的功能
               
             ...

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

还有就是我换成了ListIterator ll = al.listIterator(); 调用后运行还是空的 这。。。:'( 不科学啊
回复 使用道具 举报
这有好多种返回值,不知道你要哪种,我看了看,你是想去重是吧,这样就可以,把下面的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.         }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
kira 发表于 2014-1-25 20:18
还有就是我换成了ListIterator ll = al.listIterator(); 调用后运行还是空的 这。。。 不科学啊 ...

你看看是不是你想要的结果
回复 使用道具 举报
你的singlelement方法中ArrayList all = new ArrayList();把al1对象的引用地址覆盖了,建议换个名字,而且循环也是无效的,因为al1是空
回复 使用道具 举报
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
               
               
        }
试试我改的行不?

评分

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

查看全部评分

回复 使用道具 举报
kira 中级黑马 2014-1-26 10:54:24
9#
李跃峰 发表于 2014-1-25 23:10
你看看是不是你想要的结果

中了! 这不科学:o 我研究下究竟有哪里不一样
回复 使用道具 举报
kira 中级黑马 2014-1-26 10:57:17
10#
zhangchao 发表于 2014-1-26 00:50
毕老师新new的新容器没装数据?你肯定没看清楚。
public static ArrayList singlelement(ArrayList al){/ ...

:L 你这个功能没用 话说你这个错的有点离谱
回复 使用道具 举报
kira 中级黑马 2014-1-26 10:58:30
11#
山治0712 发表于 2014-1-26 00:47
你的singlelement方法中ArrayList all = new ArrayList();把al1对象的引用地址覆盖了,建议换个名字,而且 ...

1和l的名字的确不太好 前面问了方便 结果后面反而不方便了:lol 我下次会留心
回复 使用道具 举报
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
               
               
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马