Java算法:如何对实体进行分组
有实体列表:A、B、C、D。 每个实体都有自己的其他实体列表,LAT表示: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(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}(1,2,3),{C}(3,4)]
[{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);
});
});
}
});
});