从arraylist中提取常见对象

时间:2015-01-15 15:58:25

标签: arraylist

我有一个如下所示的列表。假设它有16个Container对象。每个Container对象都是一个简单的bean,包含年龄,重量,高度等字段。如果权重和高度相等,如果“容器”对象被认为是相等的,如何创建包含公共“容器”对象的子列表?

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

2 个答案:

答案 0 :(得分:1)

如果通过“普通”容器表示重复容器,则此代码可能对您有所帮助:

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;
        }
    }
}

如果您的意思是其他或需要澄清,请告诉我。

答案 1 :(得分:0)

感谢约翰史密斯就这个问题发表指示。我使用了迭代器,并且能够为我想要的东西提供一个很好的解决方案。以下是解决方案。请注意,容器比较会覆盖.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;

}