#java #apache-commons-collection
#java #apache-commons-collection
Вопрос:
Я пытаюсь найти объединение двух коллекций, используя метод CollectionUtils.collate . Этот метод поступает из пакета 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.collate указывает, что мне не нужны дубликаты.
Кроме того, предложение с дублированием строки было удалено, но тест все еще существует.
Я мог бы решить эту проблему, просто поместив полученную коллекцию в HashSet, но я хотел бы знать, что я сделал не так.
Спасибо.
Ответ №1:
Метод collate ожидает две отсортированные коллекции. Документ java для CollectionUtils#collate гласит: объединяет две отсортированные коллекции, a и b, в единый отсортированный список таким образом, чтобы сохранялся естественный порядок элементов.
В вашем примере два списка, предоставленные в качестве аргументов, не отсортированы. Если вы измените код для сортировки списка, например
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]
Надеюсь, это поможет.