From b135568b5d7c98e3798e34d97cea74bb686eedb5 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Tue, 22 Nov 2011 17:15:08 +0000
Subject: [PATCH] introduce a helper sort method which allows sorting of
 non-comparable objects

SVN: 23768
---
 .../common/collections/CollectionUtils.java   | 20 ++++++++++++++++++
 .../collections/CollectionUtilsTest.java      | 21 +++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/common/source/java/ch/systemsx/cisd/common/collections/CollectionUtils.java b/common/source/java/ch/systemsx/cisd/common/collections/CollectionUtils.java
index 9380b254941..3a73b50409b 100644
--- a/common/source/java/ch/systemsx/cisd/common/collections/CollectionUtils.java
+++ b/common/source/java/ch/systemsx/cisd/common/collections/CollectionUtils.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
@@ -343,4 +344,23 @@ public final class CollectionUtils
     {
         return (list != null) ? list : Collections.<E> emptyList();
     }
+    
+    /**
+     * Sorts a collection of objects with a key extractor providing sort criteria.
+     * <p>
+     * The method is useful when we would like to sort a list of non-Comparable objects.
+     */
+    public static <E, C extends Comparable<C>> void sort(List<E> list,
+            final IKeyExtractor<C, E> sortCriteriaKeyExtractor)
+    {
+        Collections.sort(list, new Comparator<E>()
+            {
+                public int compare(E o1, E o2)
+                {
+                    C key1 = sortCriteriaKeyExtractor.getKey(o1);
+                    C key2 = sortCriteriaKeyExtractor.getKey(o2);
+                    return key1.compareTo(key2);
+                }
+            });
+    }
 }
\ No newline at end of file
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/collections/CollectionUtilsTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/collections/CollectionUtilsTest.java
index e17fc31255a..3c16dda1aea 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/collections/CollectionUtilsTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/collections/CollectionUtilsTest.java
@@ -19,7 +19,9 @@ package ch.systemsx.cisd.common.collections;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertTrue;
 
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
 import org.testng.annotations.Test;
@@ -116,4 +118,23 @@ public final class CollectionUtilsTest
         }
         assertTrue("IToStringConverter can not be null.", exceptionThrown);
     }
+
+    @Test
+    public void testSort()
+    {
+        IKeyExtractor<Integer, String> lengthExtractor = new IKeyExtractor<Integer, String>()
+            {
+
+                public Integer getKey(String e)
+                {
+                    return e.length();
+                }
+            };
+
+        List<String> strings = Arrays.asList("bbbb", "z", "ccc", "aa");
+        List<String> sortedByLength = Arrays.asList("z", "aa", "ccc", "bbbb");
+
+        CollectionUtils.sort(strings, lengthExtractor);
+        assertEquals(sortedByLength, strings);
+    }
 }
-- 
GitLab