Удаление дубликатов метода CollectionUtils.collate

#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]
  

Надеюсь, это поможет.