Explorar el Código

CollectionSort: draft

Ranides Atterwim hace 9 años
padre
commit
185d450440

+ 4 - 3
assira/src/main/java/net/ranides/assira/collection/CollectionUtils.java

@@ -7,11 +7,12 @@
 
 package net.ranides.assira.collection;
 
+import net.ranides.assira.collection.iterators.IteratorUtils;
+import net.ranides.assira.functional.ProjectionFunction;
+
 import java.util.*;
 import java.util.function.Function;
 import java.util.function.Predicate;
-import net.ranides.assira.collection.iterators.IteratorUtils;
-import net.ranides.assira.functional.ProjectionFunction;
 
 /**
  *
@@ -141,5 +142,5 @@ public final class CollectionUtils {
         Arrays.sort(bsort);
         return Arrays.equals(asort, bsort);
 	}
-	
+
 }

+ 1 - 20
assira/src/main/java/net/ranides/assira/collection/Swapper.java

@@ -6,9 +6,6 @@
  */
 package net.ranides.assira.collection;
 
-import java.util.List;
-import net.ranides.assira.collection.lists.IntList;
-
 /**
  * An object that can swap elements whose position is specified by integers
  */
@@ -21,21 +18,5 @@ public interface Swapper {
      * @param b the second position to swap.
      */
     void swap(int a, int b);
-     
-    static <K> Swapper swapper(List<K> list) {
-        return (a,b) -> {
-            K t = list.get(a);
-            list.set(a, list.get(b));
-            list.set(b, t);
-        };
-    }
-    
-    static Swapper swapper(IntList list) {
-        return (a,b) -> {
-            int t = list.getInt(a);
-            list.set(a, list.getInt(b));
-            list.set(b, t);
-        };
-    }
-    
+
 }

+ 11 - 0
assira/src/main/java/net/ranides/assira/collection/lists/IntListUtils.java

@@ -14,6 +14,7 @@ import java.util.function.IntFunction;
 import java.util.function.IntPredicate;
 import java.util.function.IntUnaryOperator;
 import net.ranides.assira.collection.IntCollectionUtils;
+import net.ranides.assira.collection.Swapper;
 import net.ranides.assira.collection.arrays.NativeArrayAllocator;
 import net.ranides.assira.collection.iterators.IntListIterator;
 import net.ranides.assira.collection.iterators.RandomAccessIntIterator;
@@ -189,6 +190,16 @@ public final class IntListUtils {
 			return new AIntList.SubList(list, begin, end);
 		}
 	}
+
+	public static Swapper swapper(IntList list) {
+	    return (a,b) -> swap(list,a,b);
+    }
+
+	public static void swap(IntList list, int a, int b) {
+		int t = list.getInt(a);
+		list.set(a, list.getInt(b));
+		list.set(b, t);
+	}
 	
 	private static class RandomSubList extends AIntList.SubList implements RandomAccess {
 

+ 11 - 0
assira/src/main/java/net/ranides/assira/collection/lists/ListUtils.java

@@ -16,6 +16,7 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import net.ranides.assira.collection.CollectionUtils;
+import net.ranides.assira.collection.Swapper;
 import net.ranides.assira.collection.arrays.NativeArrayAllocator;
 import net.ranides.assira.collection.iterators.IteratorUtils;
 import net.ranides.assira.collection.iterators.RandomAccessIterator;
@@ -159,6 +160,16 @@ public final class ListUtils {
     public static <T> int compare(List<T> a, List<T> b, Comparator<? super T> cmp) {
         return IteratorUtils.compare(a.iterator(), b.iterator(), cmp);
     }
+
+    public static <T> Swapper swapper(List<T> list) {
+        return (a,b) -> swap(list,a,b);
+    }
+
+    public static <T> void swap(List<T> list, int a, int b) {
+        T t = list.get(a);
+        list.set(a, list.get(b));
+        list.set(b, t);
+    }
 	
 	private static class RandomSubList<T> extends SubList<T> implements RandomAccess {
 		

+ 135 - 0
assira/src/main/java/net/ranides/assira/collection/utils/CollectionSort.java

@@ -0,0 +1,135 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.collection.utils;
+
+import net.ranides.assira.collection.IntComparator;
+import net.ranides.assira.collection.Swapper;
+import net.ranides.assira.collection.arrays.ArrayUtils;
+import net.ranides.assira.collection.arrays.NativeArray;
+import net.ranides.assira.collection.arrays.NativeArraySort;
+import net.ranides.assira.collection.lists.IntList;
+import net.ranides.assira.collection.lists.IntListUtils;
+import net.ranides.assira.collection.lists.ListUtils;
+import net.ranides.assira.generic.CompareUtils;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+
+public final class CollectionSort {
+
+    private CollectionSort() {
+        // utility class
+    }
+
+    // @todo (assira #2) swapper/sorter for "connected" arrays
+    //  zrobić to za pomocą fluent-api:
+    //
+    //  CollectionSorter
+    //      .array(a)
+    //      .list(b,c,d)
+    //      .comparator(valuecomparator) // use cmp for values from "a"
+    //      .comparator(cint) // use cmp for indexes from "a"
+    //      .orderby(b) // use default comparator in "b" (or already specified"
+    //      .sort()
+
+
+    public static void sort1(Object collection) {
+        // sort(comparator(collection), collection);
+    }
+
+    public static void sort2(IntComparator cmp, Object collection) {
+        NativeArraySort.quickSort(0, size(collection), cmp, swapper(collection));
+    }
+
+    public static void msort1(Object... collections) {
+//        msort(comparator(collections[0]), collections);
+    }
+
+    public static void msort2(Comparator<?> cmp, Object... collections) {
+        NativeArraySort.quickSort(0, size(collections[0]), comparator(collections[0], cmp), concat(collections));
+    }
+
+    private static Swapper concat(Object... collections) {
+        Swapper[] swappers = Arrays.stream(collections).map(CollectionSort::swapper).toArray(Swapper[]::new);
+        return (a,b) -> {
+            for(Swapper s : swappers) {
+                s.swap(a,b);
+            }
+        };
+    }
+
+    private static Swapper swapper(Object object) {
+        if(object == null) {
+            throw new IllegalArgumentException("Collection is NULL");
+        }
+        if(object instanceof Swapper) {
+            return (Swapper)object;
+        }
+        if(object instanceof List) {
+            return ListUtils.swapper((List<?>)object);
+        }
+        if(object instanceof IntList) {
+            return IntListUtils.swapper((IntList)object);
+        }
+        if(object.getClass().isArray()) {
+            return NativeArray.wrap(object);
+        }
+        throw new IllegalArgumentException("Unsupported collection: " + object.getClass());
+    }
+
+    private static IntComparator comparator(Object object, Comparator cmp) {
+        if(object == null) {
+            throw new IllegalArgumentException("Collection is NULL");
+        }
+        if(object instanceof List) {
+            List<?> list = (List<?>) object;
+            return (a,b) -> cmp.compare(list.get(a), list.get(b));
+        }
+        if(object instanceof IntList) {
+            IntList list = (IntList) object;
+            return (a,b) -> cmp.compare(list.getInt(a), list.getInt(b));
+        }
+        if(object.getClass().isArray()) {
+            return NativeArray.wrap(object).comparator(cmp);
+        }
+        throw new IllegalArgumentException("Unsupported collection: " + object.getClass());
+    }
+
+    private static IntComparator comparator(Object object) {
+        if(object == null) {
+            throw new IllegalArgumentException("Collection is NULL");
+        }
+        if(object instanceof IntComparator) {
+            return (IntComparator)object;
+        }
+        if(object instanceof List) {
+            List<?> list = (List<?>) object;
+            return (a,b) -> CompareUtils.cmp(list.get(a), list.get(b));
+        }
+        if(object instanceof IntList) {
+            IntList list = (IntList) object;
+            return (a,b) -> CompareUtils.cmp(list.getInt(a), list.getInt(b));
+        }
+        if(object.getClass().isArray()) {
+            return NativeArray.wrap(object).comparator();
+        }
+        throw new IllegalArgumentException("Unsupported collection: " + object.getClass());
+    }
+
+    private static int size(Object object) {
+        if (object instanceof Collection) {
+            return ((Collection) object).size();
+        }
+        if(object.getClass().isArray()) {
+            return ArrayUtils.size(object);
+        }
+        throw new IllegalArgumentException("Unsupported collection: " + object.getClass());
+    }
+
+}

+ 2 - 1
assira/src/main/java/net/ranides/assira/test/TCollection.java

@@ -20,6 +20,7 @@ import net.ranides.assira.collection.IntCollection;
 import net.ranides.assira.collection.Swapper;
 import net.ranides.assira.collection.arrays.NativeArrayUtils;
 import net.ranides.assira.collection.arrays.ArrayAllocator;
+import net.ranides.assira.collection.lists.ListUtils;
 import net.ranides.assira.collection.maps.HashMap;
 
 /**
@@ -118,7 +119,7 @@ public abstract class TCollection<T> implements Serializable {
 		}
         
         public TItems<T> shuffle(long seed) {
-            NativeArrayUtils.shuffle(new Random(seed), data.size(), Swapper.swapper(data));
+            NativeArrayUtils.shuffle(new Random(seed), data.size(), ListUtils.swapper(data));
             return this;
         }
 

+ 2 - 1
assira/src/main/java/net/ranides/assira/test/TMap.java

@@ -20,6 +20,7 @@ import net.ranides.assira.collection.HashComparator;
 import net.ranides.assira.collection.Swapper;
 import net.ranides.assira.collection.arrays.NativeArrayUtils;
 import net.ranides.assira.collection.arrays.ArrayAllocator;
+import net.ranides.assira.collection.lists.ListUtils;
 import net.ranides.assira.collection.lookups.ALookup;
 import net.ranides.assira.collection.lookups.Lookup.LookupEntry;
 import net.ranides.assira.collection.maps.HashMap;
@@ -283,7 +284,7 @@ public abstract class TMap<K,V> implements Serializable {
 		}
         
         public TItems<K,V> shuffle(long seed) {
-            NativeArrayUtils.shuffle(new Random(seed), data.size(), Swapper.swapper(data));
+            NativeArrayUtils.shuffle(new Random(seed), data.size(), ListUtils.swapper(data));
             return this;
         }
 

+ 4 - 2
assira/src/test/java/net/ranides/assira/collection/SwapperTest.java

@@ -10,6 +10,8 @@ import java.util.Arrays;
 import java.util.List;
 import net.ranides.assira.collection.arrays.IntArrays;
 import net.ranides.assira.collection.lists.IntList;
+import net.ranides.assira.collection.lists.IntListUtils;
+import net.ranides.assira.collection.lists.ListUtils;
 import org.junit.Test;
 import static org.junit.Assert.*;
 
@@ -25,11 +27,11 @@ public class SwapperTest {
 	@Test
 	public void testSwapper() {
 		IntList list1 = IntArrays.asList(1,2,3,4);
-		Swapper.swapper(list1).swap(0, 2);
+		IntListUtils.swapper(list1).swap(0, 2);
 		assertEquals(IntArrays.asList(3,2,1,4), list1);
 		
 		List<String> list2 = Arrays.asList("1","2","3","4");
-		Swapper.swapper(list2).swap(0, 2);
+		ListUtils.swapper(list2).swap(0, 2);
 		assertEquals(Arrays.asList("3","2","1","4"), list2);
 	}
 	

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

@@ -6,7 +6,26 @@
  */
 package net.ranides.assira.collection.maps;
 
+import net.ranides.assira.ContractTesters;
+import net.ranides.assira.collection.CollectionUtils;
+import net.ranides.assira.collection.IntComparator;
+import net.ranides.assira.collection.Swapper;
+import net.ranides.assira.collection.arrays.*;
+import net.ranides.assira.collection.lists.ListUtils;
+import net.ranides.assira.collection.mockup.TMaps;
+import net.ranides.assira.collection.mockup.TPoint;
+import net.ranides.assira.collection.sets.AVLTreeSet;
+import net.ranides.assira.collection.utils.CollectionSort;
+import net.ranides.assira.junit.NewAssert;
+import net.ranides.assira.test.TCollection.TItems;
+import net.ranides.assira.test.TMap;
 import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
 import static org.junit.Assert.*;
 
 /**
@@ -14,7 +33,35 @@ import static org.junit.Assert.*;
  * @author Ranides Atterwim <ranides@gmail.com>
  */
 public class ArrayMapTest {
-    
+
+
+
+    @Test
+    public void testBasics() throws Exception {
+        TMap<TPoint, Integer> $map = TMaps.MAP_PI;
+
+        TItems<TPoint> keys = $map.keys().range(32).shuffle(5);
+        TItems<Integer> values = $map.values().range(32).shuffle(5);
+
+        ArrayMap<TPoint, Integer> map = new ArrayMap<>(
+            keys.values(), values.values(), $map.comparator()
+        );
+
+        List<TPoint> ekeys = keys.intoList();
+        List<Integer> evalues = values.intoList();
+
+        System.out.println(ekeys);
+        System.out.println(evalues);
+
+        CollectionSort.msort2($map.comparator(), ekeys, evalues);
+
+        System.out.println(ekeys);
+        System.out.println(evalues);
+
+        // @todo (assira #2) ArrayMap: test
+
+    }
+
     @Test
     public void testMap() {
         ArrayMap<String, Integer> map = new ArrayMap<>(