Java算法:如何分组实体

时间:2018-02-06 10:03:59

标签: java algorithm collections grouping

有实体清单:A,B,C,D。 每个实体都有自己的另一个实体列表,拉特说:

  • A(1,2,3)
  • B(4,5,6)
  • C(1,2)
  • D(8,9)

我需要通过第二级实体的元素的交集来对第一级实体进行分组。最后我应该得到类似的东西:

List<Set<Entity1>>: 

 - A(1, 2, 3), C(1, 2)
 - B(4, 5, 6)
 - D(8, 9)

如何在 java7 中编写?

2 个答案:

答案 0 :(得分:1)

一种选择是使用某种列表,并进行比较。 另一个选择是使用一个真正的矩阵,假设行是你的权利,列是数字。如果组合实体和数字为真,则使用X或1。然后遍历获取匹配的列(所有列都包含多个元素。)

为简单起见,请参阅列表(性能不高但完成工作):

    HashMap<String, List<String>> entities = new HashMap<String, List<String>>();
    List<String> a = new ArrayList();
    a.add("1");
    a.add("2");
    a.add("3");
    List<String> b = new ArrayList<>();
    b.add("4");
    b.add("5");
    b.add("6");
    List<String> c = new ArrayList<>();
    c.add("1");
    c.add("2");
    List<String> d = new ArrayList<>();
    d.add("8");
    d.add("9");

    entities.put("A",a);
    entities.put("B",b);
    entities.put("C",c);
    entities.put("D",d);
    System.out.println("Check");
    entities.forEach( (entity, list) -> {
        entities.forEach( (otherEntity, otherList) -> {
            if (! entity.equals(otherEntity)) {
                // System.out.println(entity + otherEntity + list + " versus " + otherList);
                list.forEach(l -> {
                    otherList.forEach(o -> {
                        // System.out.println(" " + l + o);
                        if (l.equals(o))
                            System.out.println("hit:" + entity + " and " + otherEntity);
                    });

                });
            }
        });
    });

答案 1 :(得分:-1)

不是答案,但评论太短......

我不确定是否有要求,但这可能吗?

  • A(1,2)
  • B(2,3)
  • C(3,4)

,结果将是

  • A,B,C

非最佳算法将是(伪代码)

1: initially each entity is a group
2: for each pair of group identify if there is intersection
3:     if there is, merge the groups
4:     if there is not you are done = you have groups
5: repeat the for loop while the group number is decreasing

这不是最佳选择,但可能是一个好的开始。

以上示例的详细说明

  1. 您有论坛[ {A}(1, 2), {B}(2, 3), {C}(3, 4) ]
  2. 你认识到,A和B有共同的“关系” - 2
  3. 您合并后,新群组将为[ {A, B}(1, 2, 3), {C}(3, 4) ]
  4. 你继续发现,第一组和第二组有共同关系 - 3
  5. 您合并后,新群组将为[ {A, B, C}(1, 2, 3, 4) ]
  6. 为了简化您的实施,您可以获得一组相关实体的列表。

    新输入的示例 - [ {A}(1, 2), {B}(3, 4), {C}(1 ,3) ],我将行号添加到伪代码

    • 我们最初有3个小组
    • 伪代码中的
    • 第2行基本上是2个循环,假设你识别A和C相交
    • 您在第3行中
    • 合并到[ {A, C}(1, 2, 3), {B}(3, 4) ]
    • 第5行在伪送你回到第2行,你最初有3组,你合并了,组数减少到2
    • 你继续识别交集并合并到一个组......