Ranides Atterwim 10 年之前
父节点
当前提交
891bfad0de

+ 1 - 1
assira/src/main/java/net/ranides/assira/collection/maps/AMap.java

@@ -291,7 +291,7 @@ public abstract class AMap<K, V> implements Map<K, V>, java.io.Serializable {
 
     @Override
     public void clear() {
-        throw new UnsupportedOperationException();
+        entrySet().clear();
     }
 
 }

+ 6 - 7
assira/src/main/java/net/ranides/assira/collection/maps/MultiMap.java

@@ -8,14 +8,10 @@ package net.ranides.assira.collection.maps;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.EnumSet;
 import java.util.Map;
+import java.util.NoSuchElementException;
 import java.util.Set;
-import java.util.function.BiConsumer;
 import java.util.function.BinaryOperator;
-import java.util.function.Function;
-import java.util.function.Supplier;
-import java.util.stream.Collector;
 import net.ranides.assira.collection.sets.HashSet;
 
 /**
@@ -27,7 +23,7 @@ public interface MultiMap<K,V> extends Map<K,V> {
     Collection<V> getAll(Object key);
     
     default V get(Object key, BinaryOperator<V> fold) {
-        return getAll(key).stream().reduce(null, fold);
+        return getAll(key).stream().reduce(fold).orElseThrow(()->new NoSuchElementException());
     }
     
     default boolean containsEntry(Object key, Object value) {
@@ -42,7 +38,10 @@ public interface MultiMap<K,V> extends Map<K,V> {
 
     default Collection<V> removeAll(Object key) {
         Collection<V> prev = new ArrayList<>();
-        while(null != remove(key));
+        V last;
+        while(null != (last=remove(key))) {
+            prev.add(last);
+        }
         return prev;
     }
     

+ 1 - 1
assira/src/test/java/net/ranides/assira/collection/maps/AMapTest.java

@@ -39,7 +39,7 @@ public class AMapTest {
 			.run();
     }
     
-    private static class ATMap extends AMap<TPoint, Integer> {
+    public static class ATMap extends AMap<TPoint, Integer> {
         
         private final Map<TPoint, Integer> data;
 

+ 79 - 0
assira/src/test/java/net/ranides/assira/collection/maps/MultiMapTest.java

@@ -0,0 +1,79 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.collection.maps;
+
+import java.util.Collection;
+import java.util.Set;
+import net.ranides.assira.ContractTesters;
+import net.ranides.assira.collection.mockup.TMaps;
+import net.ranides.assira.collection.mockup.TPoint;
+import net.ranides.assira.test.TMap;
+import org.junit.Test;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public class MultiMapTest {
+    
+    private final TMap<TPoint, Integer> $map = TMaps.MAP_PI;
+    
+    @Test
+    public void testSuite() {
+        ContractTesters.runner()
+            .param("map!", $map)
+            .ignore("MapTester.basicEquals_HC")
+            .function(new int[0], array -> $map.list(array).into(new MTMap()))
+			.run();
+    }
+    
+    private static final class MTMap extends AMap<TPoint, Integer> implements MultiMap<TPoint, Integer> {
+        
+        private final HashMultiMap<TPoint, Integer> data = new HashMultiMap<>();
+
+        @Override
+        public Set<Entry<TPoint, Integer>> entrySet() {
+            return data.entrySet();
+        }
+
+        @Override
+        public int size() {
+            return data.size();
+        }
+
+        @Override
+        public boolean containsKey(Object key) {
+            return data.containsKey(key);
+        }
+
+        @Override
+        public boolean containsValue(Object value) {
+            return data.containsValue(value);
+        }
+
+        @Override
+        public Integer get(Object key) {
+            return data.get(key);
+        }
+
+        @Override
+        public Collection<Integer> getAll(Object key) {
+            return data.getAll(key);
+        }
+
+        @Override
+        public Integer put(TPoint key, Integer value) {
+            return data.put(key, value);
+        }
+
+        @Override
+        public Integer remove(Object key) {
+            return data.remove(key);
+        }
+
+    }
+}

+ 0 - 1
assira/src/test/java/net/ranides/assira/collection/suite/maps/MultiMapTester.java

@@ -13,7 +13,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import javax.annotation.Resource;
-import net.ranides.assira.collection.maps.HashMultiMap;
 import net.ranides.assira.collection.maps.MultiMap;
 import net.ranides.assira.functional.Fold;
 import net.ranides.assira.generic.CompareUtils;