Классические операции над множествами для java.util.Collection

Есть ли встроенная функциональность для классических операций над множествами на Java. Util. Коллекционный класс? Моя конкретная реализация была бы для ArrayList, но это звучит как то, что должно применяться ко всем подклассам Collection. Я ищу что-то вроде:

ArrayList setA ...
ArrayList setB ...
ArrayList setAintersectionB = setA.intersection(setB);
ArrayList setAminusB = setA.subtract(setB);

После некоторых поисков мне удалось найти только домашние решения. Кроме того, я понимаю, что, возможно, я путаю идею «набора» с идеей «коллекции», не допуская и не разрешая дублирование соответственно. Возможно, это действительно просто функциональность для интерфейса Set?

В случае, если никто не знает о какой-либо встроенной функциональности, возможно, мы могли бы использовать это в качестве хранилища для стандартной практики кода операции набора Java? Я представляю, что это колесо было изобретено много раз.

вопрос задан 2.10.2008
Ross
1754 репутация

4 ответов


  • 102 рейтинг

    Пересечение сделано с Collection.retainAll; вычитание с Collection.removeAll; союз с Collection.addAll. В каждом случае Set будет действовать как набор, а List будет действовать как список.

    Как изменяемые объекты, они действуют на месте. Вам нужно будет явно копировать, если вы хотите сохранить исходный изменяемый объект без изменений.

    ответ дан Tom Hawtin - tackline, с репутацией 123417, 2.10.2008
  • 16 рейтинг

    Я бы порекомендовал Google Guava . Класс Sets , кажется, имеет именно то, что вы ищете. Он имеет метод пересечения пересечения и метод разницы . Эта презентация , вероятно, вы хотите посмотреть, если вы заинтересованы. Это относится к Google Collections, которая была оригинальным названием Guava.

    ответ дан Benno Richters, с репутацией 9008, 2.10.2008
  • 7 рейтинг

    Вы ищете Java. Util. Установить интерфейс (и его реализации HashSet и TreeSet (отсортировано))?
    Интерфейс определяет removeAll (Collection c), который выглядит как substract (), и retainAll (Collection c), который выглядит как пересечение.

    ответ дан PhiLho, с репутацией 34372, 2.10.2008
  • 6 рейтинг

    Для изменяемых операций см. Принятый ответ.

    Для неизменяемого варианта вы можете сделать это с помощью Java 8

    вычитание

    set1
      .stream()
      .filter(item-> !set2.contains(item))
      .collect(Collectors.toSet())
    

    пересечение

    set1
      .stream()
      .filter(item-> set2.contains(item))
      .collect(Collectors.toSet())
    
    ответ дан mhstnsc, с репутацией 452, 23.12.2015