关键词:collection,ArrayList,去重复 要求定义一个方法,去除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));
- }
- }
-
-
-
复制代码
|
|