在Java中排序/校对/分隔对象列表

1u4esq0p  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(130)

我有一个对象列表,我需要根据3个不同的标识符将它们放在单独的列表中。

name: test
type: type1
subType: a

name: test
type: type1
subType: b

name: test
type: type1
subType: a

name: test
type: type1
subType: b

name: newTest
type: type1
subType: a

name: newTest
type: type1
subType: b

我想要的是一个包含3个项目的列表,每个项目包含两个项目。因此,列表中的第一个列表将包含

name: test
type: type1
subType: a

name: test
type: type1
subType: b

第二项应包含

name: test
type: type1
subType: a

name: test
type: type1
subType: b

列表中的第三项将包含

name: newTest
type: type1
subType: a

name: newTest
type: type1
subType: b

所以在我的算法中,如果我看到子列表中已经有了test-type1-a的组合,我会在主列表中创建一个新项来包含它,但它只能包含名称为"test"和类型为"type1"的实体,但它可以有a和b。
我是从

List<Map<String, Map<String, Map<String, Object>>>> map = new ArrayList<>();

但是我一直在思考如何创建一个新的列表项,以及如何搜索Map列表以查看是否需要创建一个新的Map。
我想一个聪明的头脑看这个网站可能会帮助我找出一个超级简单的解决方案使用流和分组等...
谢谢!

4ioopgfo

4ioopgfo1#

我会分两步来处理这个问题:首先,将类型aB分组到单独的列表中,然后将这两个列表“压缩”到单个列表中。

List<Type1[]> doTheThing(List<Type1> input) {
    Map<SubtypeType, Queue<Type1>> grouped = res.stream().collect(
        Collectors.groupingBy(
            Type1::getSubtype,
            Collectors.toCollection<Queue<Type1>>(
                LinkedList<Type1>::new)
        )
    );
    Queue<Type1> groupA = grouped.get(SUBTYPE_A);
    Queue<Type1> groupB = grouped.get(SUBTYPE_B);
    
    List<Type1[]> zipped = new LinkedList<>();
    while(!groupA.isEmpty() || !groupB.isEmpty()) {
        zipped.add(new Type1[]{groupA.poll(), groupB.poll()});
    }
    
    return zipped;
}

相关问题