有实体清单:A,B,C,D。 每个实体都有自己的另一个实体列表,拉特说:
我需要通过第二级实体的元素的交集来对第一级实体进行分组。最后我应该得到类似的东西:
List<Set<Entity1>>:
- A(1, 2, 3), C(1, 2)
- B(4, 5, 6)
- D(8, 9)
如何在 java7 中编写?
答案 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)
不是答案,但评论太短......
我不确定是否有要求,但这可能吗?
,结果将是
非最佳算法将是(伪代码)
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
这不是最佳选择,但可能是一个好的开始。
以上示例的详细说明
[ {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) ]
,我将行号添加到伪代码
[ {A, C}(1, 2, 3), {B}(3, 4) ]