黑马程序员技术交流社区
标题:
关于“ArrayList 容器去除相同元素的方法”
[打印本页]
作者:
public_叶鹏
时间:
2015-5-6 18:53
标题:
关于“ArrayList 容器去除相同元素的方法”
关键词:
collection,ArrayList,去重复[qq]1296922265[/qq]
要求定义一个方法,去除ArrayList容器里面的重复元素(jre已定义的),思路是在方法中定义一个新的容器ArrayList,然后通过迭代,遍历需要去重复的容器里的元素,如果此元素没有被包括在新的容器里,那么就将此元素添加至新容器。反之,则不添加。最后,返回新容器。此时,容器内已经没有重复元素。
在调试的时候,原来的思路是这么写的:
public static ArrayList singleElement(ArrayList oldAL){
ArrayList newAL=new ArrayList(); //新建一个容器
for(ListIterator it=oldAL.listIterator();it.hasNext();){
Object e=it.next();
if(!newAL.contains(e)) {newAL.add(e);
}
return newAL;
}
测试结果正常。
然后我将Object e=it.next();
if(!newAL.contains(e)) {newAL.add(e);
}
这两句试图修改为
if(!newAL.contains( it.next()) ) {newAL.add( it.next());} 居然也能运行,但得出的结论是错误的!
请问:
这两句的区别在哪,1: it.next()方法返回的是对象的实体么?还是对象的引用。用Object类的引用指向这个“实体”(或“引用”),用意何在?
2:既然调用contain()方法,传递参数e 是对的,写i传递参数it.next()也没提示错误和警告,那么为什么运行后会出现不同的结果(丢失部分元素)
3:用第二种写法时,改变旧容器数据,有时还会抛出异常。
源代码如下:测试的结果分别为
第一种
原来的容器[aaa, bbb, ccc, ddd, aaa, bbb]
去重复后的容器[aaa, bbb, ccc, ddd]
第二种
原来的容器[aaa, bbb, ccc, ddd, aaa, bbb]
去重复后的容器[bbb, ddd, bbb]
package collection.test;
import java.util.ArrayList;
import java.util.Collection;
//命题:去除容器内部的重复元素
//思路:定义一个新容器,从旧容器里轮流拿出元素与新容器里的元素相比,如果相同,就去除,不相同,就保留。
import java.util.ListIterator;
//方法功能:去除ArrayList中重复的元素(java已定义的元素)
public class Collection_ArrayList_text {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static ArrayList singleElement(ArrayList oldAL){
ArrayList newAL=new ArrayList(); //新建一个容器
for(ListIterator it=oldAL.listIterator();it.hasNext();){//迭代,遍历,contatins()方法=返回新容器
/*判断新容器中是否包含旧容器中的元素,
* 如果没有包含,
* 这将此元素添加至新容器中*/
//Object e=it.next();
//if(!newAL.contains(e)) {newAL.add(e);}
if(!newAL.contains( it.next()) ) {newAL.add( it.next());}
return newAL;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args){
ArrayList al=new ArrayList();
al.add("aaa");
al.add("bbb");
al.add("ccc");
al.add("ddd");
al.add("aaa");
al.add("bbb");
System.out.println("原来的容器"+al);
System.out.println("去重复后的容器"+singleElement(al));
}
}
复制代码
作者:
rick1991chen
时间:
2015-5-6 19:48
我也是新手,就我的理解来讨论下
1、用OBJECT 是多态的用法
2、迭代器是一个容器,装的是引用,但是如果你it.next()一次,取出一个对象引用,但是同时又it.next()取出了再下一个对象引用,这2个it.next()取出的是不同的。
oldAL.it()第一次取aaa 比较newAL里没有,然后你装了aaa的下一个元素bbb进newAL,然后你读ccc,判断new中没有,装了ddd,然后你取了aaa,判断new中没有,存了下一个bbb 就是这样
至于抛异常,可能是哪里语法不对把。
作者:
王国库
时间:
2015-5-6 21:07
第21行 if(!newAL.contains( it.next()) ) {newAL.add( it.next());} 。。调用next了两次。newAL.contains( it.next())里的it.next()和newAL.add(it.next())里的it.next已经不是同一个元素了
作者:
public_叶鹏
时间:
2015-5-8 10:05
rick1991chen 发表于 2015-5-6 19:48
我也是新手,就我的理解来讨论下
1、用OBJECT 是多态的用法
2、迭代器是一个容器,装的是引用,但是如果你i ...
嗯,有道理,正解
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2