org.apache.commons.collections4

컬렉션 자료형 인터페이스

BoundedCollection<E>

  1. 크기 제한을 갖는 컬렉션
  2. isFull(), maxSize()

Bag<E>

  1. 컬렉션이 보유한 객체에 대한 개수를 유지한다
  2. 예를 들어, Bag {a, b, c, a} 인스턴스에 대해 getCount(a) == 2, uniqueSet() == {a, b, c}
  3. Bag의 일부 메서드는 Collection API와 다르게 작동하므로, Collection으로 참조하지 않을 것을 권장하고 있다

↓ java

boolean add(E object) // uniqueSet()에 있다면 카운트만 1 증가하고 false 반환 // uniqueSet()에 없다면 사본 추가 → 카운트 1 설정 → true 반환 boolean remove(Object object) // object를 모두 제거하고, 컬렉션의 변동이 있다면 true를 반환한다 boolean remove(Object object, int nCopies) boolean containsAll(Collection<?> coll) // coll의 모든 요소가 uniqueSet()에 존재하고, 각 요소에 대한 getCount(Object)가 coll에 존재하는 개수보다 크거나 같은 경우 true 반환 boolean removeAll(Collection<?> coll) // coll의 모든 요소에 대해 한 번씩 remove(Object)를 호출한 것과 같다 boolean retainAll(Collection<?> coll) // coll에 포함된 요소만 Bag에 유지하되, coll에 존재하는 개수만큼만 최대로 유지한다

SortedBag<E>

Comparator<? super E>를 이용해 원소 정렬

MultiSet<E>

Bag과 유사하지만, Collection API를 좀 더 적절하게 따른다

IterableMap<K, V>

엔트리 집합을 만들지 않고 MapIterator를 지원

IterableSortedMap<K, V>

Goto - SortedMap + Goto - OrderedMap

BoundedMap<K, V>

크기 제한이 있는 맵

BidiMap<K, V>

  1. 키와 값이 일대일 대응을 만족하도록 강제하여, 값을 통한 키의 탐색이 가능하게 한다
  2. 값을 통한 키의 탐색은 키를 통한 값의 탐색과 동일한 성능으로 이루어져야 한다
  3. 키와 값의 위치를 뒤집은 BidiMap을 반환하는 inverseBidiMap() 연산도 지원한다

SortedBidiMap<K, V>

키, 값 모두에 대한 Comparator를 갖고 있어, inverseBidiMap() 또한 SortedBidiMap

MultiValuedMap<K, V>

  1. 키에 대한 값들을 컬렉션에 보관하는 맵을 정의한다
  2. 키를 통해 얻은 컬렉션의 변경 가능 여부는 구현에 따라 다를 수 있다
  3. ListValuedMap<K, V> + SetValuedMap

OrderedMap<K, V>

키를 정렬하여 보존하고, 앞뒤로 순회 가능한 맵

OrderedBidiMap<K, V>

inverseBidiMap() 또한 OrderedBidiMap

Trie<K, V>

Prefix tree에 대해 정의한다

컬렉션 연산 인터페이스

Unmodifiable

컬렉션 변경 연산이 제공되지 않음을 표시하는 마커 인터페이스

Get<K, V>

Map 인터페이스의 읽기 기능에 대한 정의를 담고 있다. 라고 적혀있지만 remove(Object) 메서드는 여기에 있다

IterableGet<K, V>

이 인터페이스를 구현한 Map은 mapIterator() 메서드를 통해 MapIterator<K, V>를 제공한다

Put<K, V>

Map 인터페이스의 쓰기 기능에 대한 정의를 담고 있다. Put(K, V)는 V가 아닌 Object를 반환함에 유의

FluentIterable<E>

Stream과 유사한 기능을 제공하는 Iterable

↓ java

FluentIterable<E> eval() // 독립적인 새로운 뷰 반환 FluentIterable<E> append(E... elements) FluentIterable<E> collate(Iterable<? extends E> other[, Comparator<? super E> comparator]) // 현재 뷰 + other로 구성된 새로운 뷰를 정렬하여 반환 // comparator 지정하지 않은 경우 ComparatorUtils.NATURAL_COMPARATOR 사용 FluentIterable<E> loop() FluentIterable<E> reverse() FluentIterable<E> skip(long elementsToSkip) <O> FluentIterable<O> transform(Transformer<? super E, ? extends O> transformer) FluentIterable<E> unique() FluentIterable<E> zip(Iterable<? extends E> others...) boolean contains(Object object) E get(int position)

OrderedIterator<E>

역방향 순회를 추가로 지원한다

MapIterator<K, V>

  1. 이 인터페이스를 제공하는 Map은 내부에서 데이터를 Entry 객체로 유지하지 않는다(불필요한 객체 생성 방지).
  2. Entry 대신 키를 이용해 순회

  3. remove(), setValue() 연산은 구현에 따라 지원하지 않을 수 있다

OrderedMapIterator<K, V>

OrderedMap에 대한 MapIterator

ResettableIterator<E> ResettableListIterator

reset() : Iterator가 생성됐을 때 초기 위치로 돌아간다

유틸리티 클래스

BagUtils

↓ java

static <E> Bag<E> collectionBag(Bag<E> bag) // Collection API를 따르는 백 // 아래의 함수들에 대하여, SortedBag 버전이 존재한다 static <E> Bag<E> synchronizedBag(Bag<E> bag) // 스레드-안전 static <E> Bag<E≫ unmodifiableBag(Bag<? extends E> bag) // 변경 불가능한 뷰 static <E> Bag<E> predicatedBag(Bag<E> bag, Predicate<? super E> predicate) // 아이템 추가 전 테스트 추가 static <E> Bag<E> transformingBag(Bag<E> bag, Transformer<? super E, ? extends E>) // 아이템 추가 전 변환기 추가

CollectionUtils

↓ java

static <T> Collection<O> union(Iterable<? extends O> a, Iterable<? extends O> b) // a, b의 합집합(Multiset; Bag) 표현을 반환한다. + intersection, disjunction(대칭 차집합), subtract // subtract에 한하여 3번째 인자로 Predicate을 받는 함수가 존재한다 // 각 원소의 cardinality // union : a, b중 큰 쪽과 같다 // intersection : a, b중 작은 쪽과 같다 // disjunction : cardinality_of_union - cardinality_of_intersection // subtract : cardinality_of_a - cardinality_of_b static boolean containsAny(Collection<?> coll1, Collection<?> coll2) static boolean containsAll(Collection<?> coll1, Collection<?> coll2) // coll1이 coll2의 모든 원소를 포함하는지 여부를 반환한다. 각 원소에 대한 cardinality는 고려 대상이 아니다 static <?O> Map<O, Integer> getCardinalityMap(Iterable<? extends O> coll) static boolean isSubCollection(Collection<?> a, Collection<?> b) // a가 b의 부분 컬렉션인지(cardinality 고려) 여부 반환 static boolean isProperSubCollection(Collection<?> a, Collection<?> b) // isSubCollection() && cardinality_of_b > cardinality_of_a를 만족하는 원소가 적어도 하나 존재 static boolean isEqualCollection(Collection<?> a, Collection<?> b) static <E> Collection<List<E>> permutations(COllection<E> collection) // 구성 요소들에 대한 순열을 반환한다. 사이즈가 큰 경우, PermutationIterator를 이용 static <C> Collection<C> retainAll(Collection<C> collection, Collection<?> retain) // retain에 담긴 요소들만으로 구성된 컬렉션을 반환한다. 반환된 컬렉션 각 요소의 cardinality는 기존과 동일하다. retain 컬렉션의 탐색 속도가 빠를수록 함수 완료가 빨라진다 static <C> Collection<C> predicatedCollection(Collection<C> collection, Predicate<? super C> predicate) // 삽입 제약 추가

IterableUtils

+ IteratorUtils. 접합, 변환, 순회 관련 다양한 유틸리티 제공

ListUtils

↓ java

static <T> List<T> intersection(List<? extends E> list1, List<? extends E> list2) // + subtract, union, sum(union - intersection) static <T> List<T> longestCommonSubsequence(List<T> a, List<T> b) static <T> List<T> lazyList(List<E> list, Factory<? extends E> factory) // 요청된 인덱스에 한해서만 객체를 생성한다. 빈 구역은 null로 채워진다 static <T> List<List<T>> partition(List<T> list, int size)

MapUtils

↓ java

static <K> String getString(Map<? super K, ?> map, K key) // 조회된 객체에 대하여 toString() 호출. map이 null이면 null 반환. key가 map에 없어도 null 반환 // + Boolean, Number, Byte, Short, Integer, Long, Float, Double, Map, Object static <K, V> Properties toProperties(Map<K, V> map) static Map<String, Object> toMap(ResourceBundle resourceBundle) static <K, V> Map<K, V> invertMap(Map<K, V> map) // 키-값 위치를 바꾼 새 HashMap 반환 static void verbosePrint(PrintStream out, Object label, Map<?, ?> map) // + debugPrint

MultiMapUtils

↓ java

static <K, V> ListValuedMap<K, V> newListValuedHashMap() // + newSetValuedHashMap

SetUtils

↓ java

static <E> SetUtils.SetView<E> difference(Set<? extends E> a, Set<? extends E> b) // 차집합 a-b // + disjunction(대칭 차집합), intersection(교집합), union(합집합)

...bag

  1. HashBag<E>
  2. 저장소로 HashMap을 이용하는 표준 Bag 구현을 제공한다

  3. TreeBag<E>
  4. 저장소로 TreeMap을 이용하는 표준 SortedBag 구현을 제공한다

  5. CollectionBag<E> CollectionSortedBag
  6. Bag 인스턴스가 Collection API에 맞게 동작하도록 래핑하는 생성자를 제공한다

  7. UnmodifiableBag<E> UnmodifiableSortedBag
  8. Bag 인스턴스가 변경되지 않도록 래핑하는 장식자 메서드를 제공한다

  9. PredicatedBag<E> PredicatedSortedBag
  10. Bag 인스턴스에 요소 추가 제약을 거는 장식자 메서드를 제공한다. 요소 추가에 실패하는 경우 IllegalArgumentException 발생

  11. SynchronizedBag<E> SynchronizedSortedBag
  12. Bag 인스턴스가 스레드-안전하도록 래핑하는 장식자 메서드를 제공한다

  13. TransformedBag<E> TransformedSortedBag
  14. Bag 인스턴스의 요소 변환 제약을 거는 장식자 메서드를 제공한다. 기존 요소를 포함하여 변환하는 경우 transformedBag(...), 신규 요소들만 변환하는 경우 transformingBag(...)

...bidimap

  1. DualHashBidiMap<K, V>
  2. 2개의 HashMap 인스턴스를 이용한 BidiMap 구현을 제공한다

  3. TreeBidiMap<K
  4. 키, 값이 모두 정렬 가능할 때, red-black 트리를 이용한 BidiMap 구현을 제공한다

  5. UnmodifiableBidiMap<K, V> UnmodifiableOrderedBidiMap, UnmodifiableSortedBidiMap
  6. 인스턴스가 변경되지 않도록 래핑하는 장식자 메서드를 제공한다

...collection

  1. CompositeCollection<E>
  2. 다른 컬렉션(들)에 대해 하나의 뷰를 제공하는 장식자 컬렉션 구현. 뷰에 대한 add/remove 연산이 기저 컬렉션에 적용돼야 한다면 CompositeCollection.CollectionMutator를 제공해야 한다

  3. IndexedCollection<K, C>
  4. 컬렉션에 대해 맵과 비슷한 뷰를 제공하는 장식자 컬렉션 구현. 뷰에 대한 변경은 키와 기저 컬렉션에 자동으로 반영되지만, 기저 컬렉션이 직접 변경된 경우 reindex()를 통해 직접 동기화해야 한다

  5. PredicatedCollection<E>
  6. 컬렉션에 대해 삽입 제약을 거는 장식자 컬렉션 구현. Builder 팩터리 클래스도 제공한다

  7. SynchronizedCollection<E>
  8. 컬렉션이 스레드-안전하도록 래핑하는 장식자 메서드를 제공한다

  9. TransformedCollection<E>
  10. 컬렉션에 요소 변환 제약을 거는 장식자 메서드를 제공한다. 기존 요소를 포함하여 변환하는 경우 transformedCollection(...), 신규 요소들만 변환하는 경우 transformingCollection(...)

  11. UnmodifiableCollection<E> UnmodifiableBoundedCollection
  12. 컬렉션이 변경되지 않도록 래핑하는 장식자 메서드 제공

...iterators

  1. ArrayIterator<E>
  2. 배열에 대한 이터레이터 제공

  3. ArrayListIterator<E>
  4. 배열에 대한 ListIterator 프로토콜 제공)

  5. ListIteratorWrapper<E>
  6. 요소들을 캐싱하여 Iterator를 ResettableIterator로 래핑

  7. PeekingIterator<E>
  8. LoopingIterator<E> LoopingListIterator
  9. SingletonIterator<E> SingletonListIterator
  10. ReverseListIterator<E>
  11. PushbackIterator<E>
  12. next()를 취소할 수 있다. next()에서 반환하지 않은 객체도 pushback()으로 넣을 수 있으며, 래핑된 실제 iterator에는 영향을 끼치지 않는다

  13. EnumerationIterator<E>
  14. Enumeration이 이터레이터로 동작하도록 하는 어댑터 제공 + IteratorEnumeration, IteratorIterable

  15. TransformIterator<I, O>
  16. EntrySetMapIterator<K, V>
  17. 맵의 entrySet을 이용한 MapIterator 구현 제공

  18. EmptyIterator<E>
  19. + EmptyListIterator, EmptyMapIterator, EmptyOrderedIterator, EmptyOrderedMapIterator, UnmodifiableIterator, UnmodifiableListIterator, UnmodifiableMapIterator, UnmodifiableOrderedMapIterator

  20. BoundedIterator<E>
  21. 다른 이터레이터의 특정 범위만 조회하는 래퍼를 제공. + SkippingIterator

  22. FilterIterator<E> FilterListIterator, UniqueFilterIterator
  23. CollatingIterator<E>
  24. 여러 이터레이터들을 특정 순서대로 소비하는 래퍼를 제공. + ZippingIterator(각 이터레이터 1개씩 순회 조회), IteratorChain(넘겨진 순서대로 소비), LazyIteratorChain

  25. PermutationIterator<E>
  26. 순열을 순회하는 이터레이터를 제공한다

...keyvalue

  1. MultiKey<K>
  2. 여러 키 값을 하나의 키로 이용할 수 있게 해준다. 이를 통해 다중 맵을 이용하지 않고 문제를 해결할 수 있다

  3. DefaultKeyValue<K, V>
  4. Map.Entry를 구현하지 않는 키-값 쌍 기능 제공. 키와 값이 null일 수 있다. + DefaultMapEntry

  5. TiedMapEntry<K, V>
  6. 맵과 결합된 Map.Entry. 값을 변경하면 기저 맵에 반영된다

  7. UnmodifiableMapEntry<K, V>

...list

  1. CursorableLinkedList<E>
  2. ListIterator를 통한 동시 수정이 가능한 리스트 구현을 제공한다. listIterator(), cursor() 메서드로 Cursor 객체를 얻을 수 있다

  3. FixedSizeList<E>
  4. 기저 리스트 크기 고정 <- 추가/제거 거부

  5. GrowthList<E>
  6. 리스트의 크기를 벗어난 인덱스에 대한 add/set 호출이 있을 때, 빈 영역을 자동으로 null로 채운다. 음수 인덱스에 대해서는 IndexOutofBoundsException 발생

  7. LazyList<E>
  8. 리스트의 크기를 벗어난 인덱스에 대한 get 요청에 대해, 빈 영역은 null로 채우고, 특정 인스턴스를 할당하고 반환한다. 리스트 내 get 반환하려는 요소가 null인 경우, 새로 할당 시도한다

  9. PredicatedList<E> TransformedList
  10. SetUniqueList<E>
  11. TreeList<E>
  12. 임의 인덱스 삽입/제거에 최적화된 리스트 구현 제공. add, get, iterator만 이용한다면 ArrayList가 좋다

  13. UnmodifiableList<E>

...map

  1. CaseInsensitiveMap<K, V>
  2. 키의 삽입, 비교 시 모두 소문자로 변환되어 연산

  3. CompositeMap<K, V>
  4. 여러 맵들에 대해 하나의 뷰를 제공하는 장식자 맵 제공. 뷰에 대한 삽입/삭제 연산이 기저 맵에 적용되야 한다면 CompositeMap.MapMutator를 제공하면 된다

  5. DefaultedMap<K, V> LazyMap, LazySortedMap
  6. 기저 맵에 존재하지 않는 키에 대한 대체값 제공

  7. FixedSizeMap<K, V> FixedSizeSortedMap
  8. 기저 맵 크기 고정 <- 추가/제거 거부

  9. Flat3Map<K, V>
  10. 요소가 3개 이하일 때 최적으로 동작하는 맵 제공

  11. HashedMap<K, V>
  12. HashMap + MapIterator + Cloneable

  13. LinkedMap<K, V>
  14. LinkedHashMap + MapIterator + Cloneable

  15. ListOrderedMap<K, V>
  16. 삽입 순서를 List에 보존

  17. LRUMap<K, V>
  18. 임계 크기를 초과하면 가장 오래 전 사용(get/put)된 entry 제거. DEFAULT_MAX_SIZE == 100

  19. MultiKeyMap<K, V>
  20. PassiveExpiringMap<K, V>
  21. 맵에 entry를 유지할 시간을 정의. 각 시간이 지나면 맵에서 제거된다

  22. PredicatedMap<K, V> PredicatedSortedMap, TransformedMap, TransformedSortedMap
  23. ReferenceIdentityMap<K, V>
  24. 키, 값의 GC를 허용(선택적)하고, equals() 대신 ==로 일치를 판별하는 맵을 제공한다. + ReferenceMap

  25. StaticBucketMap<K, V>
  26. 주어진 한도 내에서는 고성능의 스레드-안전한 java.util.Map 구현을 제공한다. 크기가 한도를 벗어나면 O(n)에 가까워진다

  27. SingletonMap<K, V>
  28. UnmodifiableEntrySet<K, V>
  29. 변결할 수 없는 entry 집합을 반환하는 장식자 메서드 제공 + UnmodifiableMap, UnmodifiableOrderedMap, UnmodifiableSortedMap

  30. EntrySetToMapIteratorAdapter<K, V>

...multimap

  1. ArrayListValuedHashMap<K, V>
  2. HashSetValuedHashMap<K, V>
  3. TransformedMultiValuedMap<K, V>
  4. UnmodifiableMultiValuedMap<K, V>

...multiset

  1. HashMultiSet<E>
  2. PredicatedMultiSet<E>
  3. SynchronizedMultiSet<E>
  4. UnmodifiableMultiSet<E>

...queue

  1. CircularFifoQueue<E>
  2. 고정 크기 큐. 가득 찬 상태에서 add() 시 가장 마지막 요소가 null이면 덮어쓴다

  3. PredicatedQueue, SynchronizedQueue, TransformedQueue, UnmodifiableQueue

...set

  1. CompositeSet<E>
  2. 여러 셋에 대한 하나의 뷰를 제공. 뷰에 대한 연산이 기저 셋에 적용돼야 한다면 CompositeSet.SetMutator를 제공해야 한다

  3. ListOrderedSet<E>
  4. 원소 삽입 순서를 보존한다. 같은 원소에 대해 2번째 add 호출이 있는 경우, 1번째 위치를 유지한다

  5. MapBackedSet<E, V>
  6. Map을 Set처럼 이용하게 해준다

  7. PredicatedSet, PredicatedSortedSet, PredicatedNavigableSet, TransformedSet, TransformedSortedSet, TrnasformedNavigableSet, UnmodifiableSet, UnmodifiableSortedSet, UnmodifiableNavigableSet