ArrayList去除重复元素
去除一个ArrayList的重复元素有两种方法:(ArrayList与Vector的存储结构是Object[],LinkedList是双向列表)
第一种是不需要借助临时list,用equals方法比较ArrayList中数据,两次遍历原来list;
第二种是借助一个临时ArrayList,向临时List添加数据,调用arrayList.contains(obj)判断是否存在
了解ArrayList的contains原理:调用obj的equals方法进行判断在ArrayList中的位置是否大于零,进而判断是否存在。
public boolean contains(Object o) {
return indexOf(o) >= 0;
} /**
* Returns the index of the first occurrence of the specified element
* in this list, or -1 if this list does not contain the element.
* More formally, returns the lowest index <tt>i</tt> such that
* <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>,
* or -1 if there is no such index.
*/
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
1. 两种方式对ArrayList中重复字符串的处理:
@Test
// 第一种去重复方法
public void Test1() {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("4");
list.add("3");
list.add("2");
list.add("1");
System.out.println("去重复元素之前:");
for (String s : list) {
System.out.println(s);
}
// 遍历ArrayList
for (int i = 0; i < list.size() - 1; i++) {
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i).equals(list.get(j))) {
list.remove(j);
}
}
}
System.out.println(list.size());
System.out.println("去重复元素之后:");
for (String s : list) {
System.out.println(s);
}
} @Test
// 第二种去重复方法
public void Test2() {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("4");
list.add("3");
list.add("2");
list.add("1");
List<String> temp = new ArrayList<String>();
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
if (!temp.contains(str)) {
temp.add(str);
}
}
for (String s : temp) {
System.out.println(s);
}
}
2. 两种方式对ArrayList中重复对象的处理:
Person.java 重写equals方法
package cn.xm.exam.test.javaTest; import static org.hamcrest.CoreMatchers.instanceOf; public class Person { private String name;
private String id; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public Person(String name, String id) {
super();
this.name = name;
this.id = id;
} // 重写一个Bean的hashCode方法
/*
* @Override public int hashCode() { // TODO Auto-generated method stub
* return this.name.hashCode()+this.id.hashCode(); }
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
throw new ClassCastException();// 类型错误
}
Person pp = (Person) obj;
return this.getId().equals(pp.getId()) && this.getName().equals(pp.getName());
} @Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
} }
去重算法:
@Test
// 第一种去重复方法去除Object重复的
public void Test3() {
List<Person> list = new ArrayList<Person>();
list.add(new Person("张三", "1"));
list.add(new Person("张三", "2"));
list.add(new Person("张三", "3"));
list.add(new Person("张三", "4"));
list.add(new Person("李四", "1"));
list.add(new Person("李四", "2"));
list.add(new Person("张三", "1"));
list.add(new Person("李四", "1"));
// 遍历ArrayList
for (int i = 0; i < list.size() - 1; i++) {
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i).equals(list.get(j))) {
list.remove(j);
}
}
}
for (Person p : list) {
System.out.println(p);
}
} @Test
// 第二种去重复方法去除Object重复的
public void Test4() {
List<Person> list = new ArrayList<Person>();
list.add(new Person("张三", "1"));
list.add(new Person("张三", "2"));
list.add(new Person("张三", "3"));
list.add(new Person("张三", "4"));
list.add(new Person("李四", "1"));
list.add(new Person("李四", "2"));
list.add(new Person("张三", "1"));
list.add(new Person("李四", "1"));
List<Person> temp = new ArrayList<Person>();
Iterator<Person> iterator = list.iterator();
while (iterator.hasNext()) {
Person person = iterator.next();
if (!temp.contains(person)) {
temp.add(person);
}
}
for (Person p : temp) {
System.out.println(p);
}
}
结果:
Person [name=张三, id=1]
Person [name=张三, id=2]
Person [name=张三, id=3]
Person [name=张三, id=4]
Person [name=李四, id=1]
Person [name=李四, id=2]
ArrayList去除重复元素的更多相关文章
- ArrayList去除重复元素(多种方法实现)
package other; import java.util.ArrayList; import java.util.HashSet; public class test4 { public sta ...
- ArrayList去除重复元素(包括字符串和自定义对象)
1.去除重复字符串 package com.online.msym; import java.util.ArrayList; import java.util.Iterator; @SuppressW ...
- java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...
- Python列表去除重复元素
主要尝试了3种列表去除重复元素 #2.去除列表中的重复元素 #set方法 def removeDuplicates_set(nums): l2 = list(set(l1)) #用l1的顺序排序l2 ...
- Java 删除ArrayList中重复元素,保持顺序
// 删除ArrayList中重复元素,保持顺序 public static List<Map<String, Object>> removeDuplicat ...
- LintCode 521.去除重复元素
LintCode 521.去除重复元素 描述 给一个整数数组,去除重复的元素. 你应该做这些事 1.在原数组上操作 2.将去除重复之后的元素放在数组的开头 3.返回去除重复元素之后的元素个数 挑战 1 ...
- php将多个值的数组去除重复元素
array_unique(array) 只能处理value只有单个的数组. 去除有多个value数组,可以使用如下函数实现: function more_array_unique($arr=array ...
- [C++]vector去除重复元素
#include <iostream> #include <vector> #include <algorithm> #include <set> us ...
- C语言两个升序递增链表逆序合并为一个降序递减链表,并去除重复元素
#include"stdafx.h" #include<stdlib.h> #define LEN sizeof(struct student) struct stud ...
随机推荐
- 设计模式(3)-- 原型模式 (clone分析)
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建对象. 在java中有语言级别的支持:clone 在java中使用原型模式是非常简单的事情,实现Cloneable接口,调用Objec ...
- canvas基础绘制-倒计时(下)
digit_1.js: digit = [ [ [0,0,1,1,1,0,0], [0,1,1,0,1,1,0], [1,1,0,0,0,1,1], [1,1,0,0,0,1,1], [1,1,0,0 ...
- 在服务端C#如何利用NPOI构建Excel模板
目前本人接触过两种模板导出的方式:(1)C#利用NPOI接口制作Excel模板,在服务端用数据渲染模板(2)在前端利用前人搭建好的框架,利用office编写xml制作模板,在客户端进行数据的渲染,导出 ...
- 线程池ThreadPoolExecutor参数分析
概述 比如去火车站买票, 有7个(maximumPoolSize)售票窗口, 但只有3个(corePoolSize)窗口对外开放.那么对外开放的3个窗口称为核心线程数, 而最大线程数是7个窗口. 如果 ...
- BZOJ 2157: 旅游 (2017.7.21 6:30-2017.7.21 15:38 今日第一题。。)
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1754 Solved: 765 Description Ray 乐忠于旅游,这次他来到了T 城.T ...
- [整理] webpack+vuecli打包生成资源相对引用路径与背景图片的正确引用
webpack+vuecli打包生成资源相对引用路径与背景图片的正确引用 https://www.cnblogs.com/moqiutao/p/7496718.html
- docker 容器的网络
容器的网络模式 bridge -net=bridge 默认网络.docker启动后创建一个docker0网桥,默认创建的容器也添加到这个网桥 [root@localhost ~]# ip a 1: l ...
- Hibernate-03 关联映射
学习任务 关联映射 inverse属性.cascade属性 单向的多对一.双向的一对多映射 多对多映射 关联关系 类与类之间最普遍的关系就是关联关系. 单向的关联 双向的关联 单向多对一关联 以Emp ...
- HTML基础(二)列表标签
无序列表ul ul标签的格式为 <ul> <li>内容1</li> <li>内容2</li> <li>内容3</li> ...
- 2019西安多校联训 Day5
T1 光哥为了不让某初二奆佬恶心到我们而留下的火种 (貌似没这题平均分就100-了) 思路:就一横一竖让后就gztopa嘛 #include <bits/stdc++.h> using n ...