从 arraylist 中提取公共对象

Extract common objects from an arraylist

我有一个如下所示的列表。假设它有 16 个 Container 对象。每个 Container 对象都是一个简单的 bean,具有年龄、体重、身高等字段。如果 'Container' 对象被认为是相等的,我如何创建一个包含常见 'Container' 对象的子列表,如果重量和身高相等?

List<Container> containers = new ArrayList<Container>();

如果 "common" 容器是指复制容器,那么此代码可能对您有所帮助:

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


public class CommonContainers {
    public static void main(String[] args) {
        List<Container> containers = new ArrayList<Container>(16);
        for(int i=0; i<13; i++) {
            containers.add(new Container(i, i));
        }
        //add a few duplicating ones
        containers.add(new Container(1,1));
        containers.add(new Container(5,5));
        containers.add(new Container(6,6));

        List<Container> sublist = new ArrayList<Container>();
        for (Container c1 : containers) {
            for (Container c2 : containers) {
                if(c1 != c2 && c1.equals(c2)) {
                    sublist.add(c1);
                }
            }
        }

        for (Container c : sublist) {
            System.out.println(c);
        }
    }

    private static class Container {
        private int weight;
        private int height;

        @Override
        public String toString() {
            return String.format("Container[w=%d,h=%d]", weight, height);
        }

        public Container(int weight, int height) {
            this.weight = weight;
            this.height = height;
        }

        public int getWeight() {
            return weight;
        }

        public void setWeight(int weight) {
            this.weight = weight;
        }

        public int getHeight() {
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + height;
            result = prime * result + weight;
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Container other = (Container) obj;
            if (height != other.height)
                return false;
            if (weight != other.weight)
                return false;
            return true;
        }
    }
}

如果您还有其他意思或需要说明,请告诉我。

感谢 John Smith 就此问题提供指导。我改用了迭代器,并且能够很好地解决我正在寻找的问题。以下是解决方案。请注意,对于 Containers 比较,.equals 被覆盖。我使用的技术将获取主列表并创建子列表,同时从父列表中删除元素。在将主列表转换为列表子集之前,可以递归调用该解决方案。

public List<Container> extractCommonSubList(
        List<Container> masterContainerList) {

    List<Container> subList = new ArrayList<Container>();
    ListIterator<Container> iterator = masterContainerList.listIterator();

    // get first item from master list and remove from master list
    Container firstContainer = iterator.next();
    iterator.remove();

    // Add first container to sublist
    subList.add(firstContainer);

    while (iterator.hasNext()) {

        Container container = iterator.next();

        // Search for matches
        if (firstContainer.equals(container)) {
            // containers are a match, continue searching for matches
            subList.add(container);
            iterator.remove();
            continue;
        } else {
            break;
        }

    }

    // return common list
    return subList;

}