java arraylist 不重复,ArrayList去除重复元素

本文详细介绍了如何在ArrayList中去除重复元素的两种方法:一种是通过两层循环比对并移除重复项,另一种是利用临时ArrayList和contains()方法实现。同时,解释了contains()方法的工作原理,即通过调用对象的equals()方法进行判断。此外,文章还展示了针对自定义对象(如Person类)去重的情况,强调了重写equals()和hashCode()方法的重要性。
摘要由CSDN通过智能技术生成

去除一个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 i such that

* (o==null ? get(i)==null : o.equals(get(i))),

* 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 list = new ArrayList();

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 list = new ArrayList();

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 temp = new ArrayList();

Iterator 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 list = new ArrayList();

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 list = new ArrayList();

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 temp = new ArrayList();

Iterator 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]

https://www.cnblogs.com/qlqwjy/category/1035586.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值