我有两个清单:
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
我已经检查了this和this上的一些指示,但我背后有一些限制:
我正在尝试实现的正是guava的Sets.difference所提供的,除了我坚持使用Java 1.4(我能够轻松地将我的实现从使用列表更改为集合)
使用Collection.removeAll/retainAll将是一个交易破坏者,因为这些方法可以就地运行。我在列表中保存的对象是一些实际映射到Hibernate的重POJOS。
底线是,是否有类似Java 1.4的Sets实用程序类?或者可以计算两个集合的不对称差异的东西?
答案 0 :(得分:5)
就地工作可能适用于短名单,但有数百个元素,转换为HashSet
应该更快。但速度是你的问题吗?你没有提到它,但如果没有,那么你所需要的一切都是由JDK提供的,甚至在古代版本中也是如此。我不确定你的目标是什么,所以我提出了多种选择。
如果您要从x
中删除y
中包含的所有内容,请执行x.removeAll(y)
或x.removeAll(new HashSet(y))
。对于短名单,前者更快,后者对于长名单更快。
如果您不想修改x
,我建议您创建一份副本。以Guava的方式创建视图是可能的,但是更多的工作并且使用视图比直接使用集合更慢(特别是在使用大List
时,因为它们有慢contains
)。
如果您想同时从x
和y
中移除其他列表中的元素,请执行以下操作:HashSet xx = new HashSet(x), yy = HashSet(y); x.removeAll(y); y.removeAll(x);
。
请注意,通过创建新集合,不会复制任何对象,只会创建对旧对象的新引用。