java - 将对象从一个 ArrayList 移动到另一个

标签 java performance arraylist

我有三个列表,我需要使用列表 animalFilterNameAnimal 对象从列表 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/

相关文章:

android - 我应该使用什么来获得更好的性能,九补丁或可绘制的 xml 资源?

java - ArrayList 内容意外修改

java - 通过可比较接口(interface)对 ArrayList<Object> 进行排序

java - 将字符串的数组列表从 native java 返回到 JNI

java - 对象到底什么时候初始化的?

java - Netbeans 能否同时处理 32 位和 64 位版本的 Java?

java - JSTL 在尝试访问 bean 时给出错误

Java字节码 "excessive"的dup数算不算 "poor"码?

c++ - fnaf奇怪的表现

java - Windows/DOS 编译器中的 "Error: Could not find or load main class"