黑马程序员技术交流社区
标题:
[集合知识] 为ArrayList去重
[打印本页]
作者:
Hansion
时间:
2015-12-10 00:27
标题:
[集合知识] 为ArrayList去重
本帖最后由 Hansion 于 2015-12-10 00:29 编辑
两个例子:
1.ArrayList存储字符去重
2.ArrayList存储自定义对象去重
一 . ArrayList存储字符串去重。
思路:
a、重新new一个新的List集合。
b、然后遍历旧集合,然后获取旧集合中的每一个元素。
c、判断新集合中是否有 当前遍历到的元素。
有:就不添加。
没有:就添加。
代码(导包和类 我就不写了):
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<>();
al.add("111");
al.add("111");
al.add("222");
al.add("222");
al.add("111");
al.add("333");
al.add("444");
//此时集合为[111,111,222,222,111,333,444] 接下来我们进行去重操作
show(al); //调用方法去重
}
//写一个去重的方法 show();
private static void show(ArrayList<String> al) {
//1、重新new一个新的List集合。
ArrayList<String> list1 = new ArrayList<>();
//2、然后遍历旧集合,然后获取旧集合中的每一个元素。
for (int i = 0; i < al.size(); i++) {
//3.判断 如果新集合不包含遍历到的元素 就将该元素添加到新集合中
if (!list1.contains(al.get(i))) {
//就将该元素添加到新集合中
list1.add(al.get(i));
}
}
//输出结果
System.out.println(list1);
}
复制代码
二 . ArrayList存储
存储自定义对象去重
这个和第一种情况思路大同小异,不同之处是集合内存储的是对象,代码上有些不同,这里我们写一个Student类来演示
代码:
首先写一个Student类,定义成员属性name和age,写上构造方法和get set 方法 此处省略
需要注意的是,还要重写toString()方法和equals()方法,
如果不重写toString()方法,当我们打印集合的时候,输出的就会是地址值
重写equals()方法,是因为一会儿要用到ArrayList的contains()方法,它底层依赖是equals()方法,
而实际开发中,我们认为如果对象的 各个属性值都相同,那么他们就是同一个对象,
所以在这里,我们队equals()方法进行重写,判断两个对象的name和age如果相同的话,就认为他们是同一个对象
所以,如果去重对象是: 自定义类型,不要忘了重写equals().
public String toString() {
return "Student [nameString=" + name + ", age=" + age + "]";
}
public boolean equals(Object obj) {
Student stu = (Student)obj ;
return this.name.equals(stu.name) && this.age ==stu.age ;
}
复制代码
集合的代码:
这里是用的迭代器配合它的hasNext()方法还有Next()方法对需要去重的集合进行遍历,
这里有个地方需要注意:一定要定义一个变量接收Next()方法获取到的元素.后面用这个变量进行操作,而不要一直用Next()方法,因为每用一次Next()方法,指针就会向后移动,最后的结果就是错误的
如果新集合里没有遍历到的元素,就把该元素加入新集合.
public static void main(String[] args) {
ArrayList<Student> al = new ArrayList<>();
al.add(new Student("张三",23));
al.add(new Student("张三",23));
al.add(new Student("李四",24));
al.add(new Student("张三",22));
al.add(new Student("王五",26));
al.add(new Student("王五",26));
//System.out.println(al);
show(al);
}
private static void show(ArrayList<Student> al) {
//创建新集合alt
ArrayList<Student> alt = new ArrayList<>();
//获取迭代器
Iterator<Student> lit = al.iterator();
//遍历旧集合 并进行判断
while (lit.hasNext()) {
Student s = lit.next();
//如果新集合不包含遍历到的元素,就把该元素添加到新集合
if (!al.contains(s)) {
//把该元素添加到新集合
al.add(s);
}
}
System.out.println(al);
}
}
复制代码
作者:
bbaijiajinger
时间:
2015-12-10 22:24
技术含量还是挺高的
作者:
高云
时间:
2015-12-11 09:32
顶一下、
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2