📄 compositecollection.java
字号:
/*
* Copyright 2001-2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.collections.collection;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import org.apache.commons.collections.iterators.EmptyIterator;
import org.apache.commons.collections.iterators.IteratorChain;
import org.apache.commons.collections.list.UnmodifiableList;
/**
* Decorates a collection of other collections to provide a single unified view.
* <p>
* Changes made to this collection will actually be made on the decorated collection.
* Add and remove operations require the use of a pluggable strategy. If no
* strategy is provided then add and remove are unsupported.
*
* @since Commons Collections 3.0
* @version $Revision: 155406 $ $Date: 2005-02-26 12:55:26 +0000 (Sat, 26 Feb 2005) $
*
* @author Brian McCallister
* @author Stephen Colebourne
* @author Phil Steitz
*/
public class CompositeCollection implements Collection {
/** CollectionMutator to handle changes to the collection */
protected CollectionMutator mutator;
/** Collections in the composite */
protected Collection[] all;
/**
* Create an empty CompositeCollection.
*/
public CompositeCollection() {
super();
this.all = new Collection[0];
}
/**
* Create a Composite Collection with only coll composited.
*
* @param coll a collection to decorate
*/
public CompositeCollection(Collection coll) {
this();
this.addComposited(coll);
}
/**
* Create a CompositeCollection with colls as the initial list of
* composited collections.
*
* @param colls an array of collections to decorate
*/
public CompositeCollection(Collection[] colls) {
this();
this.addComposited(colls);
}
//-----------------------------------------------------------------------
/**
* Gets the size of this composite collection.
* <p>
* This implementation calls <code>size()</code> on each collection.
*
* @return total number of elements in all contained containers
*/
public int size() {
int size = 0;
for (int i = this.all.length - 1; i >= 0; i--) {
size += this.all[i].size();
}
return size;
}
/**
* Checks whether this composite collection is empty.
* <p>
* This implementation calls <code>isEmpty()</code> on each collection.
*
* @return true if all of the contained collections are empty
*/
public boolean isEmpty() {
for (int i = this.all.length - 1; i >= 0; i--) {
if (this.all[i].isEmpty() == false) {
return false;
}
}
return true;
}
/**
* Checks whether this composite collection contains the object.
* <p>
* This implementation calls <code>contains()</code> on each collection.
*
* @param obj the object to search for
* @return true if obj is contained in any of the contained collections
*/
public boolean contains(Object obj) {
for (int i = this.all.length - 1; i >= 0; i--) {
if (this.all[i].contains(obj)) {
return true;
}
}
return false;
}
/**
* Gets an iterator over all the collections in this composite.
* <p>
* This implementation uses an <code>IteratorChain</code>.
*
* @return an <code>IteratorChain</code> instance which supports
* <code>remove()</code>. Iteration occurs over contained collections in
* the order they were added, but this behavior should not be relied upon.
* @see IteratorChain
*/
public Iterator iterator() {
if (this.all.length == 0) {
return EmptyIterator.INSTANCE;
}
IteratorChain chain = new IteratorChain();
for (int i = 0; i < this.all.length; ++i) {
chain.addIterator(this.all[i].iterator());
}
return chain;
}
/**
* Returns an array containing all of the elements in this composite.
*
* @return an object array of all the elements in the collection
*/
public Object[] toArray() {
final Object[] result = new Object[this.size()];
int i = 0;
for (Iterator it = this.iterator(); it.hasNext(); i++) {
result[i] = it.next();
}
return result;
}
/**
* Returns an object array, populating the supplied array if possible.
* See <code>Collection</code> interface for full details.
*
* @param array the array to use, populating if possible
* @return an array of all the elements in the collection
*/
public Object[] toArray(Object[] array) {
int size = this.size();
Object[] result = null;
if (array.length >= size) {
result = array;
}
else {
result = (Object[]) Array.newInstance(array.getClass().getComponentType(), size);
}
int offset = 0;
for (int i = 0; i < this.all.length; ++i) {
for (Iterator it = this.all[i].iterator(); it.hasNext();) {
result[offset++] = it.next();
}
}
if (result.length > size) {
result[size] = null;
}
return result;
}
/**
* Adds an object to the collection, throwing UnsupportedOperationException
* unless a CollectionMutator strategy is specified.
*
* @param obj the object to add
* @return true if the collection was modified
* @throws UnsupportedOperationException if CollectionMutator hasn't been set
* @throws UnsupportedOperationException if add is unsupported
* @throws ClassCastException if the object cannot be added due to its type
* @throws NullPointerException if the object cannot be added because its null
* @throws IllegalArgumentException if the object cannot be added
*/
public boolean add(Object obj) {
if (this.mutator == null) {
throw new UnsupportedOperationException(
"add() is not supported on CompositeCollection without a CollectionMutator strategy");
}
return this.mutator.add(this, this.all, obj);
}
/**
* Removes an object from the collection, throwing UnsupportedOperationException
* unless a CollectionMutator strategy is specified.
*
* @param obj the object being removed
* @return true if the collection is changed
* @throws UnsupportedOperationException if removed is unsupported
* @throws ClassCastException if the object cannot be removed due to its type
* @throws NullPointerException if the object cannot be removed because its null
* @throws IllegalArgumentException if the object cannot be removed
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -