如何在Java中找到多个集合的所有交集的列表?
我有一份布景清单:
setlist = [s1,s2,s3...sn]
我想要一个集合的全方位比较,即2^n个集合:
setIntersection = [s1 ∩ s2, s1 ∩ s2 ∩ s3, ....., s2 ∩ s3 ∩ s4, ...., sn-1 ∩ sn]
在Java中实现这一点的最佳方法是什么
例如,如果我只使用了5套。我希望能够填充5 circle venn diagram.的所有重叠
我正试图通过一系列场景来实现这一点:
List<Set<People>> lListSets = new ArrayList<Set<People>>();
for (DaysObject day : listOfDaysInJanuary) {
lListSets.add(day.peopleOneInternet());
}
findPowerSetsAndCompare(lListSets, listOfDaysInJanuary);
我想找到一些结果,比如:
January 1 (Bob, Sally, Tommy)
January 1, January 2 (Sally, Tommy)
...
so on for all possible combination of days.
本质上,我要问的是如何将powerset algorithm与集合并集相结合
# 1 楼答案
你描述的第一部分是powerset(上周我编辑了你的问题)。然后,您将获得动力集中每套装置的交点
因为你要做的是一个集合的幂集,而不是一个简单的整数幂集,所以实现将更加复杂
额外学分
我为你的需求写了一个基本的实现,作为你如何实现它的一个例子。本例中的所有方法和类型都是
Example
类的成员示例类,仅使用其
main
方法演示工作代码。我相信您会原谅我在演示中使用了不推荐的Date
构造函数Person是一种简单的
enum
人名类型。在这里使用枚举的好处是,它可以为所需的HashSet
行为提供适当的equals()
和hashCode()
实现PeopleByDays扩展
HashSet<Person>
以收集另外一组Date
对象来表示日期。覆盖retainAll()
(intersect)以合并天数;覆盖equals()
和hashSet()
以在外部集合中实现正确的行为powerSet()方法,逐字取自this answer
intersect()方法为动力集中的每组集合创建交集
sort()方法按日期对生成的相交集进行排序
format()方法格式化每个交叉口的天数列表
最后是输出
希望有帮助。我修补它的时间比我预想的要长得多;)但仍然没有对输出中的人名进行排序