java – 将对象从ArrayList移动​​到Other

我有三个列表,我需要使用list 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);
                }
            }
        }

    }

}

最佳答案 为了获得更好的性能,您需要使用集合.我很确定你正在做的是m = animalSource.size()和n = animalFilterName.size()的O(m * n)操作,因为ArrayLists中的查找是n阶(对于列表大小)

集合中的查找,插入和删除通常是分摊的常量时间或对数时间(对于集合的大小)(取决于集合实现的具体情况),因此最坏的情况是,使用集合会将此值减少为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和loop中省略换行使它们看起来更整洁.这是个人偏好,你没有义务复制我的风格.

编辑:固定时间复杂度

另一个编辑:当你说移动时,你的意思是添加到一个列表并从另一个列表中删除?或者你只是想添加到一个列表?

第三编辑:固定碎片线

点赞