计算Java 1.4中两个列表的不对称差异

时间:2012-10-08 21:28:38

标签: java collections guava set asymmetric

我有两个清单:

List x = [1, 2, 5, 7, 8];
List y = [1, 3, 4, 5];

我正在尝试获得以下计算的不对称差异:

x - y (what's in x that's not in y) => 2 7 8
y - x (what's in y that's not in x) => 3 4

我已经检查了thisthis上的一些指示,但我背后有一些限制:

  1. 我正在尝试实现的正是guava的Sets.difference所提供的,除了我坚持使用Java 1.4(我能够轻松地将我的实现从使用列表更改为集合)

  2. 使用Collection.removeAll/retainAll将是一个交易破坏者,因为这些方法可以就地运行。我在列表中保存的对象是一些实际映射到Hibernate的重POJOS。

  3. 从这个意义上讲,我需要一些基于散列的实现,因为这个计算已经在那些POJOS中实现了。
  4. 底线是,是否有类似Java 1.4的Sets实用程序类?或者可以计算两个集合的不对称差异的东西?

1 个答案:

答案 0 :(得分:5)

就地工作可能适用于短名单,但有数百个元素,转换为HashSet应该更快。但速度是你的问题吗?你没有提到它,但如果没有,那么你所需要的一切都是由JDK提供的,甚至在古代版本中也是如此。我不确定你的目标是什么,所以我提出了多种选择。

如果您要从x中删除y中包含的所有内容,请执行x.removeAll(y)x.removeAll(new HashSet(y))。对于短名单,前者更快,后者对于长名单更快。

如果您不想修改x,我建议您创建一份副本。以Guava的方式创建视图是可能的,但是更多的工作并且使用视图比直接使用集合更慢(特别是在使用大List时,因为它们有慢contains)。

如果您想同时从xy中移除其他列表中的元素,请执行以下操作:HashSet xx = new HashSet(x), yy = HashSet(y); x.removeAll(y); y.removeAll(x);

请注意,通过创建新集合,不会复制任何对象,只会创建对旧对象的新引用。