怎么比较消除list中的重复元素

如何比较消除list中的重复元素

在开发中去重复是一项重要的功能,但是如何有效快速的取出重复呢?有几种情况:

第一种情况:list里面只有单个元素的去重。原来通过比较contains这个方法。这个方法实际上调用了系统底层的equals方法。

List list=new ArrayList();

list.add(1);

list.add(2);

list.add(3);

list.add(1);

 

List  list2=new ArrayList();

for (int i=0;i<list2.size();i++) {

      if(!list2.contains(list.get(i))){//判断list2中是否有list.get(i),如果有则不加入集合,没有则加入,这样达到去除重复的目的

list2.add(list.get(i));//元素加入到list2

}

}

 

第二种情况:list里面都是对象,对象之间属性值相同。去除重复。这种方法很麻烦,需要不断的循环进行比较。不推荐。。

/**

* 消除重复的元素

* @param nodeArr

* @return

*/

private List<AuthorNode> deleteSameElement(AuthorNode[] nodeArr){

List<AuthorNode> list1=Arrays.asList(nodeArr);//把数组转化为集合

List<AuthorNode> list2=new ArrayList<AuthorNode>();//把list1里面的内容加入到list2里面去

for (AuthorNode temp : list1) {

list2.add(temp);

}

try {

for (int i=0;i<nodeArr.length;i++) {

String s1=NumberHelper.stringToHex(nodeArr[i].getTextContent().trim());

int count=0;//记录元素重复的个数

for(int j=0;j<list1.size();j++){

String s2=NumberHelper.stringToHex(list1.get(j).getTextContent().trim());

if(s1.equals(s2)){//如果相同

count++;//数量自增

}

if(count>1){//如果大于1则 出现重复

list2.remove(list1.get(j));//移除重复元素

count--;//始终保持count为1

}

}

}

} catch (Exception e) {

// TODO: handle exception

System.out.println("消除重复元素出错!");

e.printStackTrace();

}

return list2;

}

这样返回的list2中,就是去除重复属性的元素了。

 

第三种方法:覆写对象的equals方法和hascode方法。这个方法很简单。以为无论list接口还是set接口在每次加入到集合的时候都要判断两者内容是否相等,怎么判断呢?就是通过equals方法。而如果想要equals方法返回true时,必须让haxcode编码也是一样。这个要切记

我在这里建立了student类:

public class Student {

private int id;

private String name;

public Student(int id,String name){

this.id=id;

this.name=name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public boolean equals(Object arg0) {

// TODO Auto-generated method stub

if(arg0 instanceof Student){//判断比较的对象是否是studetn类

Student s=(Student) arg0;

if(s.getId()==this.id&&s.getName().equals(this.name)){//判断如果属性值都相同

return true;

}else{

return false;

}

}else{

return false;

}

//return super.equals(arg0);

}

 

@Override

public int hashCode() {

// TODO Auto-generated method stu

return (this.name.hashCode())+(String.valueOf(this.id).hashCode());//如果内容相同则,让返回的hascode编码唯一

//return super.hashCode();

}

 

主方法:

Student student1=new Student(1,"a");

Student student2=new Student(2,"b");

Student student3=new Student(3,"c");

Student student4=new Student(3,"c");

Set<Student> set=new HashSet<Student>();//hashset测试size大小为3

set.add(student1);

set.add(student2);

set.add(student3);

set.add(student4);

System.out.println(set.size());

 

 

List<Student> list=new ArrayList<Student>();//list的测试size大小也为3

if(!list.contains(student1)){

list.add(student1);

}

if(!list.contains(student2)){

list.add(student2);

}

if(!list.contains(student3)){

list.add(student3);

}

if(!list.contains(student4)){

list.add(student4);

}

System.out.println(list.size());

 

如果不进行覆写equals和hascode方法,则会调用object类。只是地址进行比较不能进行内容比较。所以一般jdk的string类默认进行了equals和hascode方法的覆写。我们在使用的时候直接使用即可了。

所以一定要记住如果自定义类要比较对象一定要覆写equals方法和hascode方法。并且equals返回true的时候,两对象的hascode编码要一样。