1

我有两个清单:

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(我很容易将我的实现从使用 Lists 更改为 Sets)

  2. 使用Collection.removeAll/retainAll将是一个交易破坏者,因为这些方法就地工作。我在列表中持有的对象是一些实际映射到 Hibernate 的重型 POJOS。

  3. 从这个意义上说,我需要一些应该从基于哈希的实现中解决的东西,因为这种计算已经在那些 POJOS 中实现了。

底线是,有没有像 Java 1.4 的 Sets 实用程序类的东西?或者可以计算两个集合的不对称差异的东西?

4

1 回答 1

5

对于短列表来说,就地工作可能很好,但有数百个元素,转换为HashSet应该更快。但是速度是你的问题吗?你没有提到它,但如果没有,那么你需要的一切都由 JDK 提供,即使在你的旧版本中也是如此。我不确定你的目标是什么,所以我提出了多种选择。

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

如果您不想修改x,我建议创建一个副本。以 Guava 的方式创建视图是可能的,但它的工作量更大,并且使用视图比直接使用集合要慢(尤其是在使用大型Lists 时,因为它们的速度很慢contains)。

如果您想同时从另一个列表的元素x和元素中删除,请执行以下操作:yHashSet xx = new HashSet(x), yy = HashSet(y); x.removeAll(y); y.removeAll(x);

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

于 2012-10-08T22:10:13.670 回答