[BAEL-7306] Add methods for sorting a list (#15462)

Co-authored-by: rajatgarg <rajatgarg@adobe.com>
This commit is contained in:
Rajat Garg 2023-12-21 10:34:32 +05:30 committed by GitHub
parent a87d4fbdb3
commit 288178f87b
3 changed files with 138 additions and 0 deletions

View File

@ -13,4 +13,20 @@
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>${vavr.version}</version>
</dependency>
</dependencies>
<properties>
<vavr.version>0.10.4</vavr.version>
</properties>
</project>

View File

@ -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<String> sortUsingForLoop(List<String> listToSort, List<String> listWithOrder) {
List<String> sortedList = new ArrayList<>();
for(String element: listWithOrder) {
if(listToSort.contains(element)) {
sortedList.add(element);
}
}
return sortedList;
}
static void sortUsingComparator(List<String> listToSort, List<String> listWithOrder) {
listToSort.sort(Comparator.comparingInt(listWithOrder::indexOf));
}
static void sortUsingStreamAPI(List<String> listToSort, List<String> listWithOrder) {
Map<String,Integer> indicesMap = listWithOrder.stream().collect(Collectors.toMap(e->e, listWithOrder::indexOf));
listToSort.sort(Comparator.comparingInt(indicesMap::get));
}
static void sortUsingMap(List<String> listToSort, List<String> listWithOrder) {
Map<String, Integer> 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<String> sortUsingGuava(List<String> listToSort, List<String> listWithOrder) {
Ordering<String> explicitOrdering = Ordering.explicit(listWithOrder);
List<String> sortedList = explicitOrdering.sortedCopy(listToSort);
return sortedList;
}
static List<String> sortUsingVavr(List<String> listToSort, List<String> listWithOrder) {
io.vavr.collection.List<String> listWithOrderedElements = io.vavr.collection.List.ofAll(listWithOrder);
io.vavr.collection.List<String> listToSortElements = io.vavr.collection.List.ofAll(listToSort);
io.vavr.collection.List<String> sortedList = listToSortElements.sortBy(listWithOrderedElements::indexOf);
return sortedList.asJava();
}
}

View File

@ -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<String> listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
List<String> listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
sortUsingForLoop(listToSort, listWithOrder);
List<String> expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
assertEquals(expectedSortedList, listWithOrder);
}
@Test
public void givenTwoList_whenUsingComparator_thenSort() {
List<String> listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
List<String> listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
sortUsingComparator(listToSort, listWithOrder);
List<String> expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
assertEquals(expectedSortedList, listToSort);
}
@Test
public void givenTwoList_whenUsingStreamAPI_thenSort() {
List<String> listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
List<String> listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
sortUsingStreamAPI(listToSort, listWithOrder);
List<String> expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
assertEquals(expectedSortedList, listToSort);
}
@Test
public void givenTwoList_whenUsingMap_thenSort() {
List<String> listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
List<String> listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
sortUsingMap(listToSort, listWithOrder);
List<String> expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
assertEquals(expectedSortedList, listToSort);
}
@Test
public void givenTwoList_whenUsingGuavaExplicit_thenSort() {
List<String> listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
List<String> listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
sortUsingGuava(listToSort, listWithOrder);
List<String> expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
assertEquals(expectedSortedList, listWithOrder);
}
@Test
public void givenTwoList_whenUsingVavr_thenSort() {
List<String> listWithOrder = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
List<String> listToSort = Arrays.asList("Pizza", "Burger", "Fries", "Coke");
sortUsingVavr(listToSort, listWithOrder);
List<String> expectedSortedList = Arrays.asList("Burger", "Coke", "Fries", "Pizza");
assertEquals(expectedSortedList, listWithOrder);
}
}