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();
         }
-
     }
 
     /**