如何将列表拆分为子列表

时间:2015-07-13 14:25:07

标签: java list

不幸的是,我在Java 7中,所以我不能使用任何Java 8的设施。

我有以下枚举:

public enum Type
{
    MAILING,
    RESEPT,
    CURRENT,
    //...
    USER
}

和该类型的类容器:

public class Container
{
    public Type getType()
    {
        // Impl
    }
}

现在我有一些List<Container>。如何将其拆分为List<List<Container>>,以使List<Container>中的任何List<List<Container>>仅包含Container getType()个{{1}}。

3 个答案:

答案 0 :(得分:3)

如果您使用的是Java 8,则可以使用Stream - API的Collectors.groupingBy(...)。然后你得到Map<Type, List<Container>>返回。然后你可以循环遍历地图的值并将其放入列表中。

答案 1 :(得分:2)

对于Java 7,我建议循环使用枚举values()

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

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

for (Type type : Type.values()) {
    List<Container> containerTypeList = new ArrayList<>();
    for (Container c : completeList) {
        if (c.getType().equals(type)) {
            containerTypeList.add(c);
        }
    }

    splitList.add(containerTypeList);
}

答案 2 :(得分:2)

这是一种略有不同的Java 7方法:

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

containers.add(/* ... */);
containers.add(/* ... */);
containers.add(/* ... */);
containers.add(/* ... */);
containers.add(/* ... */);
containers.add(/* ... */);

Map<Type, List<Container>> split = new HashMap<>();

for (Container container : containers) {
    if (!split.containsKey(container.getType())) {
        split.put(container.getType(), new ArrayList<Container>());
    }
    split.get(container.getType()).add(container);
}

List<List<Container>> listOfLists = new ArrayList<>(split.values());