怎么比较消除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编码要一样。