当前位置: 代码迷 >> J2SE >> 求高效算法:ArrayList中删除另外一个ArrayList中存在的对象。该如何解决
  详细解决方案

求高效算法:ArrayList中删除另外一个ArrayList中存在的对象。该如何解决

热度:110   发布时间:2016-04-23 19:53:45.0
求高效算法:ArrayList中删除另外一个ArrayList中存在的对象。
如题,有两个List:

List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();

list1.add("1");
list1.add("2");
list1.add("3");
list1.add("4");
list1.add("5");

list2.add("1");
list2.add("3");
list2.add("5");

现在要将list1中的1,3,5删除,要求效率越高越好。

我自己写了个,感觉效率很差!

public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();

list1.add("1");
list1.add("2");
list1.add("3");
list1.add("4");
list1.add("5");

list2.add("1");
list2.add("3");
list2.add("5");

boolean restart = false;
int i =0;
out:
for( ;i<list1.size();){
int j=0;
for(;j<list2.size();j++){
if(list1.get(i).equals(list2.get(j))){
list1.remove(list1.get(i));
restart = true;
break;
}
}
if(j == list2.size()){
restart = false;
}
if(restart){
i = 0;
continue out;
}else{
i++;
}
}
}

------解决思路----------------------
重写一下Person类的equals方法,改成当和其他类比较时,只要name相同就返回true.
 再同样的removeAll应该就可以了... LZ不妨试试.
------解决思路----------------------
引用:
8L能给个列子吗

list3=list2.clone();
Iterator<Persion>iter1=list1.iterator();
while(iter.hasNext()){
 Persion p=iter.next();
 for(Iterator<Teacher>iter2=list3.iterator();iter2.hasNext();){
  if(p.getName().equals(iter2.next().getName())){
   iter.remove();
   iter2.remove();
   break;
  }
 }
}
我这个例子肯定没有7楼的效率高,但7楼的方式要求重写Persion的equals和hashCode方法。
建议你将Persion作为Teacher的父类,比对时不应只考虑姓名,毕竟有重名的可能。
------解决思路----------------------
是不是可以这样写

package csdn;

public class Person {
private String name = "";
private String age = "";

public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}

public Person(String name, String age){
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object o){
if (null == o)
return false;
if (!(o instanceof Person))
return false;
Person p = (Person)o;
if (this.name.equals(p.getName()) && this.age.equals(p.getAge()))
return true;
return false;
}

@Override
public String toString(){
return this.name + "-" + this.age;
}
}


package csdn;

public class Teacher extends Person{

private String type;

public Teacher(String name, String age, String type) {
super(name, age);
this.type = type;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}
}


package csdn;

import java.util.ArrayList;
import java.util.List;

public class Test {

public static void main(String[] args) {
List<Person> list1 = new ArrayList<Person>();
list1.add(new Person("1", "21"));
list1.add(new Person("2", "22"));
list1.add(new Person("3", "23"));
list1.add(new Person("4", "24"));
list1.add(new Person("5", "25"));


List<Person> list2 = new ArrayList<Person>();
list2.add(new Teacher("1", "21", "语文"));
list2.add(new Teacher("3", "23", "数学"));
list2.add(new Teacher("5", "25", "英语"));

list1.removeAll(list2);  
for(Person per: list1){
  System.out.println(per);
}
}

}
  相关解决方案