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 9380b25494106783dde10982fcc62bc3861590c1..3a73b50409bd2d8475503bfe1e8f5812f4e9497a 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 e17fc31255a34ed2963ff8b24cb60eeced3668ac..3c16dda1aea40866b25a56c472ae67f86442b9ca 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); + } }