You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2011/05/22 14:20:24 UTC

svn commit: r1125937 - in /incubator/jena/Jena2/ARQ/trunk: src-test/org/openjena/atlas/lib/TestMultiSet.java src/org/openjena/atlas/lib/MultiSet.java

Author: andy
Date: Sun May 22 12:20:23 2011
New Revision: 1125937

URL: http://svn.apache.org/viewvc?rev=1125937&view=rev
Log:
Add methods to MultiSet

Modified:
    incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/lib/TestMultiSet.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/lib/MultiSet.java

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/lib/TestMultiSet.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/lib/TestMultiSet.java?rev=1125937&r1=1125936&r2=1125937&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/lib/TestMultiSet.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/atlas/lib/TestMultiSet.java Sun May 22 12:20:23 2011
@@ -74,6 +74,47 @@ public class TestMultiSet extends BaseTe
         iterTest(data) ;
     }
 
+    @Test public void multiSet_08()
+    {
+        String[] data = {  } ;
+        MultiSet<String> x = add(data) ;
+        assertEquals(0, x.size()) ;
+    }
+    
+    @Test public void multiSet_09()
+    {
+        String[] data = { "A", "A" } ;
+        MultiSet<String> x = add(data) ;
+        assertEquals(2, x.size()) ;
+    }
+
+    @Test public void multiSet_10()
+    {
+        String[] data = { "A", "A" } ;
+        MultiSet<String> x = add(data) ;
+        x.remove("A") ;
+        assertEquals(1, x.size()) ;
+        x.remove("A") ;
+        assertEquals(0, x.size()) ;
+        x.remove("A") ;
+        assertEquals(0, x.size()) ;
+    }
+    
+    @Test public void multiSet_11()
+    {
+        String[] data = { "A", "A" } ;
+        MultiSet<String> x = add(data) ;
+        long c = Iter.count(x.elements()) ;
+        assertEquals(1, c) ;
+    }
+    
+    private static MultiSet<String> add(String[] data)
+    {
+        MultiSet<String> x = new MultiSet<String>() ;
+        for ( String str : data )
+            x.add(str) ;
+        return x ;
+    }
     
     private static void iterTest(String[] data)
     {

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/lib/MultiSet.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/lib/MultiSet.java?rev=1125937&r1=1125936&r2=1125937&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/lib/MultiSet.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/atlas/lib/MultiSet.java Sun May 22 12:20:23 2011
@@ -19,6 +19,8 @@ import java.util.NoSuchElementException 
 public class MultiSet<T> implements Iterable<T>
 {
     private Map<T,RefLong> map   = new HashMap<T,RefLong>() ;
+    private int multiSetSize = 0 ;
+    
     private RefLong _get(T obj)
     {
         RefLong z = map.get(obj) ;
@@ -36,8 +38,11 @@ public class MultiSet<T> implements Iter
     /** Does it contain the object? */
     public boolean contains(T obj)  { return map.containsKey(obj) ; }
     
+    /** Yiled one object per element (i.e without counts) */
+    public Iterator<T> elements()   { return map.keySet().iterator() ; }
+
     /** Add an object */
-    public void add(T obj)          { _get(obj).inc(); } 
+    public void add(T obj)          { _get(obj).inc(); multiSetSize++ ; } 
 
     /** Remove one occurrence of the object from the multiset */
     public void remove(T obj)
@@ -45,6 +50,7 @@ public class MultiSet<T> implements Iter
         RefLong x = map.get(obj) ;
         if ( x == null ) return ;
         x.dec() ;
+        multiSetSize-- ;
         if ( x.value() == 0 )
             map.remove(obj) ;
     }
@@ -52,11 +58,13 @@ public class MultiSet<T> implements Iter
     /** Remove all occurrences of the object in themultiset */
     public void removeAll(T obj)
     {
+        RefLong x = map.get(obj) ;
+        multiSetSize -= x.value() ;
         map.remove(obj) ;
     }
 
     /* Remove everything */
-    public void clear() { map.clear() ; }
+    public void clear() { map.clear() ; multiSetSize = 0 ; }
     
     
     /** Get the count of the number of times the object appears in the multiset - i.e. it's cardinality.
@@ -68,6 +76,21 @@ public class MultiSet<T> implements Iter
         return map.get(obj).value() ;
     }
     
+    public int size()
+    {
+//        int count = 0 ;
+//        for ( Map.Entry<T, RefLong> e : map.entrySet() )
+//            count += e.getValue().value() ;
+//        //return count ;
+//        if ( count != multiSetSize )
+//        {
+//            Log.warn(this, "Mismatch") ;
+//            return count ; 
+//        }
+
+        return multiSetSize ;
+    }
+    
     //@Override
     private Iterator<T> iterator1()
     {
@@ -89,7 +112,7 @@ public class MultiSet<T> implements Iter
             
             Iterator<T> keys = map.keySet().iterator() ;
             T key = null ;
-            long count = 0 ;
+            long keyCount = 0 ;
             T slot = null ;
             
             //@Override
@@ -103,9 +126,9 @@ public class MultiSet<T> implements Iter
                 
                 if ( key != null )
                 {
-                    if ( count < count(key) )
+                    if ( keyCount < count(key) )
                     {
-                        count++ ;
+                        keyCount++ ;
                         slot = key ;
                         return true ;
                     }
@@ -116,7 +139,7 @@ public class MultiSet<T> implements Iter
                 if ( keys.hasNext() )
                 {
                     key = keys.next() ;
-                    count = 1 ;
+                    keyCount = 1 ;
                     slot = key ;
                     return true ;
                 }