我有三个列表,我需要使用列表 animalFilterName 将 Animal 对象从列表 animalSource 移动到列表 animalTarget>。只有名字出现在列表 animalFilterName 中的 Animal 应该从 animalSource 移动到 animalTarget我在下面做。现在仅使用示例数据。
public class Animal {
private String name;
private String color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
public class MoveAnimal {
/**
* @param args
*/
public static void main(String[] args) {
List<Animal> animalSource = new ArrayList<Animal>();
List<String> animalFilterName = new ArrayList<String>();
List<Animal> animalTarget = new ArrayList<Animal>();
animalFilterName.add("Name1");
animalFilterName.add("Name2");
Animal a1 = new Animal();
a1.setColor("Color1");
a1.setName("Name1");
Animal a2 = new Animal();
a2.setColor("Color2");
a2.setName("Name2");
Animal a3 = new Animal();
a3.setColor("Color1");
a3.setName("Name3");
Animal a4 = new Animal();
a4.setColor("Color1");
a4.setName("Name4");
Animal a5 = new Animal();
a5.setColor("Color5");
a5.setName("Name1");
animalSource.add(a1);
animalSource.add(a2);
animalSource.add(a3);
animalSource.add(a4);
animalSource.add(a5);
for(String s: animalFilterName) {
for(Animal a: animalSource) {
if(s.equals(a.getName())) {
animalTarget.add(a);
}
}
}
}
}
最佳答案
为了获得更好的性能,您可能需要使用 Sets。我很确定你正在做的是 m = animalSource.size() 和 n = animalFilterName.size() 的 O(m * n) 操作,因为 ArrayLists 中的查找是 n 阶(到列表大小)
Set 中的查找、插入和删除通常是摊销常数时间或对数时间(根据集合的大小)(取决于集合实现的具体情况)所以最坏的情况下,使用集合会将其减少到 O( m * log(n)) 对于相同的 m 和 n。
Set<Animal> animalSource = ...;
Set<Animal> animalTarget = ...;
Set<String> animalFilterName = ...;
// add matching animals to new set
for (Animal a : animalSource)
if (animalFilterName.contains(a.getName())) animalTarget.add(a);
// if you need to remove them from the first set, uncomment these lines
// for (Animal a : animalTarget)
// animalSource.remove(a);
我认为在一行 ifs 和循环中省略换行符会使它们看起来更整洁。这是个人喜好,您没有义务照搬我的风格。
编辑:固定时间复杂度
另一个编辑:当你说移动时,你的意思是添加到一个列表并从另一个列表中删除?或者你只是说添加到一个列表?
第三次编辑:修复了零散的行
关于java - 将对象从一个 ArrayList 移动到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253075/