【问题标题】:List of unique objects containing unique sub-objects包含唯一子对象的唯一对象列表
【发布时间】:2022-01-05 19:17:27
【问题描述】:

我正在尝试获取唯一对象列表,其中每个对象还包含唯一子对象列表。下面示例中的唯一性由每个类中的id 字段确定。

public class MyMain {
    public static void main(String[] args) {
        Parent p1 = new Parent(1L);
        Child c11 = new Child(11L);
        Child c12 = new Child(12L);

        Parent p2 = new Parent(2L);
        Child c21 = new Child(21L);
        Child c22 = new Child(22L);
        Child c23 = new Child(23L);

        Holder holder1 = new Holder(p1.getId(), c11.getId());
        Holder holder2 = new Holder(p1.getId(), c11.getId());
        Holder holder3 = new Holder(p1.getId(), c11.getId());
        Holder holder4 = new Holder(p1.getId(), c11.getId());
        Holder holder5 = new Holder(p1.getId(), c12.getId());
        Holder holder6 = new Holder(p1.getId(), c12.getId());
        Holder holder7 = new Holder(p1.getId(), c12.getId());

        Holder holder8 = new Holder(p2.getId(), c21.getId());
        Holder holder9 = new Holder(p2.getId(), c21.getId());
        Holder holder10 = new Holder(p2.getId(), c21.getId());
        Holder holder11 = new Holder(p2.getId(), c22.getId());
        Holder holder12 = new Holder(p2.getId(), c23.getId());
        Holder holder13 = new Holder(p2.getId(), c23.getId());

        List<Holder> holders = new ArrayList<>();
        holders.add(holder1); holders.add(holder2); holders.add(holder3); holders.add(holder4);
        holders.add(holder5); holders.add(holder6); holders.add(holder7); holders.add(holder8);
        holders.add(holder9); holders.add(holder10); holders.add(holder11); holders.add(holder12); holders.add(holder13);
    }
}

@Value
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
class Parent {
    @EqualsAndHashCode.Include
    public Long id;
    public List<Child> chidren;

    public Parent(Long id) { this.id = id; }
}

@Value
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
class Child {
    @EqualsAndHashCode.Include
    public Long id;

    public Child(Long id) { this.id = id; }
}

@Value
class Holder {
    Long parentId;
    Long childId;

    public Holder(Long parentId, Long childId) {
        this.parentId = parentId;
        this.childId = childId;
    }
}

从上面的代码片段中,我希望得到一个List&lt;Parent&gt;(来自holders ),它将包含两个父级:p1p2。然后,每个父级都会有一个 List&lt;Child&gt;,其中包含该父级的唯一子级。

预期输出:

List<Parent> will have p1 and p2
p1.List<Child> will have c11 and c12 (only 2 entries)
p2.List<Child> will have c21, c22, c23 (only 3 entries)

我已经研究出如何获得独特父母的列表,但也不确定如何获得独特的孩子。

更新:

以下似乎对我有用,但是,不确定是否有更好的方法。

public class MyMain {
    public static void main(String[] args) {
        MyMain m = new MyMain();
        Parent p1 = new Parent(1L, null);
        Child c11 = new Child(11L);
        Child c12 = new Child(12L);

        Parent p2 = new Parent(2L, null);
        Child c21 = new Child(21L);
        Child c22 = new Child(22L);
        Child c23 = new Child(23L);

        Holder holder1 = new Holder(p1.getId(), c11.getId());
        Holder holder2 = new Holder(p1.getId(), c11.getId());
        Holder holder3 = new Holder(p1.getId(), c11.getId());
        Holder holder4 = new Holder(p1.getId(), c11.getId());
        Holder holder5 = new Holder(p1.getId(), c12.getId());
        Holder holder6 = new Holder(p1.getId(), c12.getId());
        Holder holder7 = new Holder(p1.getId(), c12.getId());

        Holder holder8 = new Holder(p2.getId(), c21.getId());
        Holder holder9 = new Holder(p2.getId(), c21.getId());
        Holder holder10 = new Holder(p2.getId(), c21.getId());
        Holder holder11 = new Holder(p2.getId(), c22.getId());
        Holder holder12 = new Holder(p2.getId(), c23.getId());
        Holder holder13 = new Holder(p2.getId(), c23.getId());

        List<Holder> holders = new ArrayList<>();
        holders.add(holder1); holders.add(holder2); holders.add(holder3); holders.add(holder4);
        holders.add(holder5); holders.add(holder6); holders.add(holder7); holders.add(holder8);
        holders.add(holder9); holders.add(holder10); holders.add(holder11); holders.add(holder12); holders.add(holder13);

        Map<Long, Set<Long>> returnSet= holders.stream()
                .collect(Collectors.toMap(Holder::getParentId, x -> m.uniqChildIdSet(x), MyMain::merge));

        System.out.println(returnSet);
    }

    public static Set<Long> uniqChildIdSet(Holder holder) {
        HashSet<Long> uniqChild = new HashSet();
        uniqChild.add(holder.getChildId());
        return uniqChild;
    }

    public static Set<Long> merge(Set<Long> l1, Set<Long> l2) {
        l1.addAll(l2);
        return l1;
    }
}

@Value
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
class Parent {
    @EqualsAndHashCode.Include
    public Long id;
    public List<Child> chidren;

    public Parent(Long id, List<Child> chidren) { this.id = id;
        this.chidren = chidren;
    }
}

@Value
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
class Child {
    @EqualsAndHashCode.Include
    public Long id;

    public Child(Long id) { this.id = id; }
}

@Value
class Holder {
    Long parentId;
    Long childId;

    public Holder(Long parentId, Long childId) {
        this.parentId = parentId;
        this.childId = childId;
    }
}

【问题讨论】:

    标签: collections java-8 java-stream


    【解决方案1】:

    这是你可以使用的,没有任何辅助方法。

    它基本上在做的事情如下

    1. Holder 的父ID 分组
    2. 对于这个Holder,获取所有childId 属性并将它们放入Set&lt;Long&gt;
    Map<Long, Set<Long>> returnSet =  holders.stream()
                                             .collect(Collectors.groupingBy(
                                                          Holder::getParentId, 
                                                          Collectors.mapping(
                                                              Holder::getChildId, 
                                                              Collectors.toSet()
                                                          )
                                                      )
                                                  );
    

    输出

    {1=[11, 12], 2=[21, 22, 23]}

    【讨论】:

    • 像魅力一样工作。谢谢
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多