diff --git a/core-java-modules/core-java-collections-list-6/pom.xml b/core-java-modules/core-java-collections-list-6/pom.xml index 46ef4ff4c9..18a153ff06 100644 --- a/core-java-modules/core-java-collections-list-6/pom.xml +++ b/core-java-modules/core-java-collections-list-6/pom.xml @@ -13,4 +13,20 @@ 0.0.1-SNAPSHOT + + + com.google.guava + guava + ${guava.version} + + + io.vavr + vavr + ${vavr.version} + + + + + 0.10.4 + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java b/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java new file mode 100644 index 0000000000..b53b3a946a --- /dev/null +++ b/core-java-modules/core-java-collections-list-6/src/main/java/com/baeldung/sorting/SortingBasedOnAnotherList.java @@ -0,0 +1,52 @@ +package com.baeldung.sorting; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.google.common.collect.Ordering; + +public class SortingBasedOnAnotherList { + static List sortUsingForLoop(List listToSort, List listWithOrder) { + List sortedList = new ArrayList<>(); + for(String element: listWithOrder) { + if(listToSort.contains(element)) { + sortedList.add(element); + } + } + return sortedList; + } + + static void sortUsingComparator(List listToSort, List listWithOrder) { + listToSort.sort(Comparator.comparingInt(listWithOrder::indexOf)); + } + + static void sortUsingStreamAPI(List listToSort, List listWithOrder) { + Map indicesMap = listWithOrder.stream().collect(Collectors.toMap(e->e, listWithOrder::indexOf)); + listToSort.sort(Comparator.comparingInt(indicesMap::get)); + } + + static void sortUsingMap(List listToSort, List listWithOrder) { + Map orderedIndicesMap = new HashMap<>(); + for(int i = 0; i < listWithOrder.size(); i++) { + orderedIndicesMap.put(listWithOrder.get(i), i); + } + listToSort.sort(Comparator.comparingInt(orderedIndicesMap::get)); + } + + static List sortUsingGuava(List listToSort, List listWithOrder) { + Ordering explicitOrdering = Ordering.explicit(listWithOrder); + List sortedList = explicitOrdering.sortedCopy(listToSort); + return sortedList; + } + + static List sortUsingVavr(List listToSort, List listWithOrder) { + io.vavr.collection.List listWithOrderedElements = io.vavr.collection.List.ofAll(listWithOrder); + io.vavr.collection.List listToSortElements = io.vavr.collection.List.ofAll(listToSort); + io.vavr.collection.List sortedList = listToSortElements.sortBy(listWithOrderedElements::indexOf); + return sortedList.asJava(); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java b/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java new file mode 100644 index 0000000000..2ed7d52eee --- /dev/null +++ b/core-java-modules/core-java-collections-list-6/src/test/java/com/baeldung/sorting/SortingBasedOnAnotherListUnitTest.java @@ -0,0 +1,70 @@ +package com.baeldung.sorting; + +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingComparator; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingForLoop; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingGuava; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingMap; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingStreamAPI; +import static com.baeldung.sorting.SortingBasedOnAnotherList.sortUsingVavr; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class SortingBasedOnAnotherListUnitTest { + @Test + public void givenTwoList_whenUsingForLoop_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingForLoop(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listWithOrder); + } + + @Test + public void givenTwoList_whenUsingComparator_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingComparator(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listToSort); + } + + @Test + public void givenTwoList_whenUsingStreamAPI_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingStreamAPI(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listToSort); + } + + @Test + public void givenTwoList_whenUsingMap_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingMap(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listToSort); + } + + @Test + public void givenTwoList_whenUsingGuavaExplicit_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingGuava(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listWithOrder); + } + + @Test + public void givenTwoList_whenUsingVavr_thenSort() { + List listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + List listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke"); + sortUsingVavr(listToSort, listWithOrder); + List expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza"); + assertEquals(expectedSortedList, listWithOrder); + } +} \ No newline at end of file