diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml index aaf63a2b2a..51e2d6e0ee 100644 --- a/core-java-modules/core-java-collections-4/pom.xml +++ b/core-java-modules/core-java-collections-4/pom.xml @@ -20,10 +20,16 @@ commons-lang ${commons-lang.version} + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + 2.2 + 3.12.0 - \ No newline at end of file + diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java index a9e7bc8a38..83466a7208 100644 --- a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java @@ -2,8 +2,11 @@ package com.baeldung.collections.sorting; import java.util.Date; +import javax.annotation.Nonnull; + public class Employee implements Comparable{ + @Nonnull private String name; private Date joiningDate; diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CheckFieldsOneByOne.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CheckFieldsOneByOne.java new file mode 100644 index 0000000000..a5126f6057 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CheckFieldsOneByOne.java @@ -0,0 +1,15 @@ +package com.baeldung.collections.sorting.multiple; + +import java.util.Comparator; + + +public class CheckFieldsOneByOne implements Comparator { + @Override + public int compare(Person o1, Person o2) { + int nameCompare = o1.getName().compareTo(o2.getName()); + if(nameCompare != 0) { + return nameCompare; + } + return Integer.compare(o1.getAge(), o2.getAge()); + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparatorLambda.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparatorLambda.java new file mode 100644 index 0000000000..33cb9c5803 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparatorLambda.java @@ -0,0 +1,10 @@ +package com.baeldung.collections.sorting.multiple; + +import java.util.Comparator; + +public class ComparatorLambda { + public static Comparator createEmployeeComparator() { + return Comparator.comparing(Person::getName) + .thenComparing(Person::getAge); + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CompareToBuilderExample.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CompareToBuilderExample.java new file mode 100644 index 0000000000..7ca32c5aff --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CompareToBuilderExample.java @@ -0,0 +1,15 @@ +package com.baeldung.collections.sorting.multiple; + +import java.util.Comparator; + +import org.apache.commons.lang3.builder.CompareToBuilder; + +public class CompareToBuilderExample implements Comparator { + @Override + public int compare(Person o1, Person o2) { + return new CompareToBuilder() + .append(o1.getName(), o2.getName()) + .append(o1.getAge(), o2.getAge()) + .build(); + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparisonChainExample.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparisonChainExample.java new file mode 100644 index 0000000000..7b586a43bd --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparisonChainExample.java @@ -0,0 +1,15 @@ +package com.baeldung.collections.sorting.multiple; + +import java.util.Comparator; + +import com.google.common.collect.ComparisonChain; +import com.google.common.collect.Ordering; + +public class ComparisonChainExample implements Comparator { + @Override + public int compare(Person o1, Person o2) { + return ComparisonChain.start() + .compare(o1.getName(), o2.getName(), Ordering.natural().nullsFirst()) + .compare(o1.getAge(), o2.getAge()).result(); + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/Person.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/Person.java new file mode 100644 index 0000000000..08ba7bc965 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/Person.java @@ -0,0 +1,29 @@ +package com.baeldung.collections.sorting.multiple; + +public class Person { + private String name; + private int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + // getters and setters + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } +} diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java new file mode 100644 index 0000000000..4608730567 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.collections.sorting.multiple; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +public class ComparatorsUnitTest { + @Test + public void givenPersonsList_whenComparedOnTwoFields_thenReturnCorrectOrder() { + Person person1 = new Person("John", 21); + Person person2 = new Person("Tom", 20); + // Another employee named John + Person person3 = new Person("John", 22); + + List> comparators = + Arrays.asList(new CheckFieldsOneByOne(), + new ComparisonChainExample(), + new CompareToBuilderExample(), + ComparatorLambda.createEmployeeComparator()); + // All comparators should produce the same result + for(Comparator comparator : comparators) { + Assertions.assertIterableEquals( + Arrays.asList(person1, person2, person3) + .stream() + .sorted(comparator) + .collect(Collectors.toList()), + Arrays.asList(person1, person3, person2)); + } + } +}