Java算法:如何对实体进行分组

Java算法:如何对实体进行分组,java,algorithm,collections,grouping,Java,Algorithm,Collections,Grouping,有实体列表:A、B、C、D。 每个实体都有自己的其他实体列表,LAT表示: 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) 列表: -A(1,2,3),C(1,2) -B(4、5、6) -D(8、9) 我怎样才能用java7写呢?这

有实体列表:A、B、C、D。 每个实体都有自己的其他实体列表,LAT表示:

  • 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)
列表:
-A(1,2,3),C(1,2)
-B(4、5、6)
-D(8、9)

我怎样才能用java7写呢?

这不是一个真正的答案,但是太短了,不能评论

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

  • A(1,2)
  • B(2,3)
  • C(3,4)
结果将是

  • A、 B,C
非最优算法(伪代码)

1:最初,每个实体都是一个组
2:对于每组,确定是否存在交叉点
3:如果有,合并组
4:如果没有,则表示您有组
5:在组号减少时重复for循环
这不是最优的,但可能是一个良好的开端

以上示例的详细说明

  • 您有组
    [{A}(1,2),{B}(2,3),{C}(3,4)]
  • 您确定A和B有共同的“关系”-2
  • 合并后,新的组将是
    [{A,B}(1,2,3),{C}(3,4)]
  • 你继续发现,第一组和第二组有共同的关系-3
  • 合并后,新组将
    [{A,B,C}(1,2,3,4)]
  • 为了简化您的实现,您可以为组创建一个相关实体的列表


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

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

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

        为了简单起见,请参见清单(虽然性能不高,但可以完成任务):

        HashMap entities=newhashmap();
        列表a=新的ArrayList();
        a、 添加(“1”);
        a、 添加(“2”);
        a、 添加(“3”);
        列表b=新的ArrayList();
        b、 添加(“4”);
        b、 添加(“5”);
        b、 添加(“6”);
        列表c=新的ArrayList();
        c、 添加(“1”);
        c、 添加(“2”);
        列表d=新的ArrayList();
        d、 添加(“8”);
        d、 添加(“9”);
        实体。出售(“A”,A);
        实体。出售(“B”,B);
        实体。出售(“C”,C);
        实体。出售(“D”,D);
        系统输出打印项次(“检查”);
        实体。forEach((实体,列表)->{
        实体.forEach((其他实体,其他列表)->{
        如果(!entity.equals(其他实体)){
        //System.out.println(实体+其他实体+列表+”对“+其他列表);
        列表。forEach(l->{
        otherList.forEach(o->{
        //系统输出打印项次(“+l+o”);
        如果(l等于(o))
        System.out.println(“点击:+entity+”和“+otherEntity”);
        });
        });
        }
        });
        });
        
        分组的逻辑是什么?C和A是因为它的数字列表包含在A的列表中吗?比如说E(1,2,5,6)会发生什么?在初始情况下,你有列表或集合吗?@Mauricepery元素(A,C)应该被分组在一个列表中,因为它们至少有一个相似的元素(但在示例中有两个:1,2)@HansSchreuder在初始情况下,我有一个元素列表(A,B,C…)@Nikolas会发生什么,比如说E(1,2,5,6)? (两个元素与A相同,两个元素与B相同,两个元素与C相同)但这只是识别重叠,没有“合并”,对吗?对。我想把实现的一部分留给海报,他说Java7而不是Java8:)使用“for(Entity:entities)”构造,而不是“foreach”和“->”。逻辑保持不变,用Java7重写它,没有问题,谢谢)是的,我们找到了匹配项。但是如何将这些匹配分为不同的集合呢?这个解决方案很有趣。但是假设我们有初始群:[{A}(1,2),{B}(3,4),{C}(1,3)]。当我们比较A和B时,没有比较,我们将它们分为不同的组。但当我们比较A和C时,它会匹配,B和C也会匹配。我认为如何处理这种情况这不是一个问题,每次合并时,实际上都是从头开始,在新的元素组中确定交集。。。你们需要O(n^3)个成员的比较——在外循环中,你们合并,比如说一对,为了找到交集,你们需要比较每一对。。。
            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);
                            });
        
                        });
                    }
                });
            });