我正在尝试使用CollectionUtils.collat​​e方法找到两个集合的并集。此方法来自包org.apache.commons.collections4

这是代码部分:

Collection<String> tokensUnion2 = CollectionUtils.collate(
    Arrays.asList(new String[]{"my", "sentence", "test", "for", "testing"}),
    Arrays.asList(new String[]{"my", "sentence", "test", "is", "this"}),
    false);


结果集合如下:

[my, sentence, test, for, test, is, testing, this]


如您所见,即使CollectionUtils.collat​​e的第三个参数表明我不希望重复,生成的集合也包含重复的内容。

另外,删除了String重复句子,但测试仍然存在。

我可以通过将结果集合放入HashSet中来解决此问题,但是我想知道自己做错了什么。

谢谢。

最佳答案

collat​​e方法需要两个排序的集合。用于CollectionUtils#collat​​e的Java文档说:将两个已排序的Collections a和b合并到一个已排序的List中,从而保留元素的自然顺序。

在您的示例中,作为参数提供的两个列表未排序。如果您修改代码以对列表进行排序,例如

List<String> list1 = Arrays.asList(new String[] { "my", "sentence", "test", "for", "testing" });
List<String> list2 = Arrays.asList(new String[] { "my", "sentence", "test", "is", "this" });

Collections.sort(list1);
Collections.sort(list2);

Collection<String> tokensUnion2 = CollectionUtils.collate(list1, list2, false);


这将为您返回一个已排序的集合,该集合将没有重复项

[for, is, my, sentence, test, testing, this]


我希望这有帮助。

10-07 14:25