You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2015/11/21 21:14:15 UTC
svn commit: r1715565 -
/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java
Author: tn
Date: Sat Nov 21 20:14:15 2015
New Revision: 1715565
URL: http://svn.apache.org/viewvc?rev=1715565&view=rev
Log:
Complete KeysMultiSet view.
Modified:
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java
Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java?rev=1715565&r1=1715564&r2=1715565&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/multimap/AbstractMultiValuedMap.java Sat Nov 21 20:14:15 2015
@@ -19,7 +19,6 @@ package org.apache.commons.collections4.
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
-import java.lang.reflect.Array;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
@@ -39,7 +38,8 @@ import org.apache.commons.collections4.i
import org.apache.commons.collections4.iterators.LazyIteratorChain;
import org.apache.commons.collections4.iterators.TransformIterator;
import org.apache.commons.collections4.keyvalue.AbstractMapEntry;
-import org.apache.commons.collections4.set.UnmodifiableSet;
+import org.apache.commons.collections4.multiset.AbstractMultiSet;
+import org.apache.commons.collections4.multiset.UnmodifiableMultiSet;
/**
* Abstract implementation of the {@link MultiValuedMap} interface to simplify
@@ -59,7 +59,7 @@ public abstract class AbstractMultiValue
private transient EntryValues entryValuesView;
/** The KeyMultiSet view */
- private transient KeysMultiSet keysMultiSetView;
+ private transient MultiSet<K> keysMultiSetView;
/** The map used to store the data */
private transient Map<K, Collection<V>> map;
@@ -308,8 +308,10 @@ public abstract class AbstractMultiValue
*/
@Override
public MultiSet<K> keys() {
- return keysMultiSetView != null ? keysMultiSetView
- : (keysMultiSetView = new KeysMultiSet());
+ if (keysMultiSetView == null) {
+ keysMultiSetView = UnmodifiableMultiSet.unmodifiableMultiSet(new KeysMultiSet());
+ }
+ return keysMultiSetView;
}
@Override
@@ -526,17 +528,7 @@ public abstract class AbstractMultiValue
/**
* Inner class that provides a MultiSet<K> keys view.
*/
- private class KeysMultiSet implements MultiSet<K> {
-
- @Override
- public boolean addAll(Collection<? extends K> c) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void clear() {
- throw new UnsupportedOperationException();
- }
+ private class KeysMultiSet extends AbstractMultiSet<K> {
@Override
public boolean contains(Object o) {
@@ -549,45 +541,13 @@ public abstract class AbstractMultiValue
}
@Override
- public Object[] toArray() {
- final Object[] result = new Object[size()];
- int i = 0;
- final Iterator<K> it = getMap().keySet().iterator();
- while (it.hasNext()) {
- final K current = it.next();
- for (int index = getCount(current); index > 0; index--) {
- result[i++] = current;
- }
- }
- return result;
+ public int size() {
+ return AbstractMultiValuedMap.this.size();
}
@Override
- public <T> T[] toArray(T[] array) {
- final int size = size();
- if (array.length < size) {
- @SuppressWarnings("unchecked")
- // safe as both are of type T
- final T[] unchecked = (T[]) Array.newInstance(array.getClass().getComponentType(), size);
- array = unchecked;
- }
-
- int i = 0;
- final Iterator<K> it = getMap().keySet().iterator();
- while (it.hasNext()) {
- final K current = it.next();
- for (int index = getCount(current); index > 0; index--) {
- // unsafe, will throw ArrayStoreException if types are not
- // compatible, see javadoc
- @SuppressWarnings("unchecked")
- final T unchecked = (T) current;
- array[i++] = unchecked;
- }
- }
- while (i < array.length) {
- array[i++] = null;
- }
- return array;
+ protected int uniqueElements() {
+ return getMap().size();
}
@Override
@@ -601,127 +561,28 @@ public abstract class AbstractMultiValue
}
@Override
- public int setCount(K object, int count) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean add(K object) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int add(K object, int nCopies) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean remove(Object object) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int remove(Object object, int nCopies) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Set<K> uniqueSet() {
- return UnmodifiableSet.unmodifiableSet(keySet());
- }
-
- @Override
- public Set<MultiSet.Entry<K>> entrySet() {
- // TODO: implement
- throw new UnsupportedOperationException();
+ protected Iterator<MultiSet.Entry<K>> createEntrySetIterator() {
+ final MapEntryTransformer transformer = new MapEntryTransformer();
+ return IteratorUtils.transformedIterator(map.entrySet().iterator(), transformer);
}
- @Override
- public int size() {
- return AbstractMultiValuedMap.this.size();
- }
-
- @Override
- public boolean containsAll(Collection<?> coll) {
- final Iterator<?> e = coll.iterator();
- while (e.hasNext()) {
- if(!contains(e.next())) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public boolean removeAll(Collection<?> coll) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean retainAll(Collection<?> coll) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Iterator<K> iterator() {
- return new LazyIteratorChain<K>() {
-
- final Iterator<K> keyIterator = getMap().keySet().iterator();
-
- @Override
- protected Iterator<? extends K> nextIterator(int count) {
- if (!keyIterator.hasNext()) {
- return null;
+ private final class MapEntryTransformer
+ implements Transformer<Map.Entry<K, Collection<V>>, MultiSet.Entry<K>> {
+ @Override
+ public MultiSet.Entry<K> transform(final Map.Entry<K, Collection<V>> mapEntry) {
+ return new AbstractMultiSet.AbstractEntry<K>() {
+ @Override
+ public K getElement() {
+ return mapEntry.getKey();
}
- final K key = keyIterator.next();
- final Iterator<V> colIterator = getMap().get(key).iterator();
- Iterator<K> nextIt = new Iterator<K>() {
-
- @Override
- public boolean hasNext() {
- return colIterator.hasNext();
- }
-
- @Override
- public K next() {
- colIterator.next();// Increment the iterator
- // The earlier statement would throw
- // NoSuchElementException anyway in case it ends
- return key;
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
- };
- return nextIt;
- }
- };
- }
- @Override
- public String toString() {
- if (size() == 0) {
- return "[]";
- }
- final StringBuilder buf = new StringBuilder();
- buf.append('[');
- final Iterator<K> it = KeysMultiSet.this.uniqueSet().iterator();
- while (it.hasNext()) {
- final Object current = it.next();
- final int count = getCount(current);
- buf.append(current);
- buf.append(':');
- buf.append(count);
- if (it.hasNext()) {
- buf.append(", ");
- }
+ @Override
+ public int getCount() {
+ return mapEntry.getValue().size();
+ }
+ };
}
- buf.append(']');
- return buf.toString();
}
-
}
/**