Java 计算两个集合的相互作用或并集的有效方法

Java 计算两个集合的相互作用或并集的有效方法,java,algorithm,Java,Algorithm,我有两个ArrayList,每个ArrayList存储一组元素。我想获得并输出这两个集合的交集。有什么有效而优雅的方法来实现这一点吗?工会怎么样 联合:将它们添加到哈希集中 交集:将其中一个添加到哈希集中。添加第二个列表的成员时,记录哪些是冲突。如果数据在逻辑上是一个集合,则应将其存储在集合中,例如哈希集合,而不是列表。如果您不介意创建新副本集和/或修改其中一个现有副本集,则可以使用addAll和retainal来获取并集/交集 HashSet s0 = new HashSet(arraylis

我有两个ArrayList,每个ArrayList存储一组元素。我想获得并输出这两个集合的交集。有什么有效而优雅的方法来实现这一点吗?工会怎么样

联合:将它们添加到哈希集中


交集:将其中一个添加到哈希集中。添加第二个列表的成员时,记录哪些是冲突。

如果数据在逻辑上是一个集合,则应将其存储在
集合
中,例如
哈希集合
,而不是
列表
。如果您不介意创建新副本集和/或修改其中一个现有副本集,则可以使用
addAll
retainal
来获取并集/交集

HashSet s0 = new HashSet(arraylist0);
s0.retainAll(arraylist1);
System.out.println("Intersection: " + s0);

s0 = new HashSet(arraylist0);
s0.addAll(arraylist1);
System.out.println("Union: " + s0);
另一个选项是使用的类创建两个集合的并集、交集等的视图:

Set<Foo> union = Sets.union(firstSet, secondSet);
Set union=Set.union(第一集,第二集);

这样的视图对于创建(恒定时间)和执行大多数操作(尤其是
包含
)非常有效,但对于其他操作,例如
大小
,可能必须迭代元素。它们还反映输入集的状态,即使这些集在创建后被修改。

计算交集/并集的最简单方法是延迟进行。这需要固定的时间和内存。例如,要获取由某个点成员身份分类器(也称为PMC)描述的两个集合的并集,可以执行以下操作:

def union(pmc_a, pmc_b)
    return lambda x : pmc_a(x) or pmc_b(x)
当然,为了避免这些琐事,您必须定义与您感兴趣的集合类型和希望使用的数据结构类型相关的并集和交集

  • 例如,如果集合是离散的,那么您应该使用散列集合,正如Marcin和Pajton所建议的那样

  • 如果它们是由闭合半空间(ie)的交集、并集和补集构成的连续集,则BSP树是一种更好的数据结构,可以为您提供线性时间布尔运算(对于固定维度)

  • 另一方面,如果它们是任意代数集(换句话说,由一组多项式方程的0给出),那么您将无法使用来计算

  • 最后,对于一般半代数集(即多项式不等式集),最好使用Tarski-Sedenberg和圆柱代数分解。后一种方法有些不可靠,在一般情况下是无法确定的


  • 当然,还有更多类型的算法专门用于各种类型的集合及其表示。因此,为了计算这些操作,您必须首先描述正在处理的对象的种类,以及如何表示它们。

    数组列表是否排序?如果是这样的话,您可以通过列表的一次迭代来完成这两个操作。如果不是,我不太确定。我正在处理的一组可以是一组字符串,也可以是一组数值。换句话说,我可以有两个字符串的ArrayList,并希望输出它们的交点;或者,我可以有两个整数值的数组列表,并希望输出它们的交点。这些信息足够吗?非常感谢。好的,那么其他答案中描述的简单哈希表方法应该可以工作(这是我在这里描述的方法列表中的第1项)。这一答复的要点是指出你最初的问题可以在更广泛的背景下解释:)