[BAEL-5840] Sort a collection of Objects on multiple fields (#12950)
* [BAEL-5840] Sort a collection of Objects on multiple fields * Fix maven plugin version * Fix pom again * Fix again * Move to core-java-collections-4 module * Remove unused files * Test renaming * Handle NPE * Use Nonnull annotation * remove redundant dependency * remove redundant scope * Update pom.xml
This commit is contained in:
parent
f9e34aa9f1
commit
032b8e2d64
@ -20,10 +20,16 @@
|
|||||||
<artifactId>commons-lang</artifactId>
|
<artifactId>commons-lang</artifactId>
|
||||||
<version>${commons-lang.version}</version>
|
<version>${commons-lang.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>${commons-lang3.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<commons-lang.version>2.2</commons-lang.version>
|
<commons-lang.version>2.2</commons-lang.version>
|
||||||
|
<commons-lang3.version>3.12.0</commons-lang3.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -2,8 +2,11 @@ package com.baeldung.collections.sorting;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
public class Employee implements Comparable<Employee>{
|
public class Employee implements Comparable<Employee>{
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
private String name;
|
private String name;
|
||||||
private Date joiningDate;
|
private Date joiningDate;
|
||||||
|
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.baeldung.collections.sorting.multiple;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
|
||||||
|
public class CheckFieldsOneByOne implements Comparator<Person> {
|
||||||
|
@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());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.baeldung.collections.sorting.multiple;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
public class ComparatorLambda {
|
||||||
|
public static Comparator<Person> createEmployeeComparator() {
|
||||||
|
return Comparator.comparing(Person::getName)
|
||||||
|
.thenComparing(Person::getAge);
|
||||||
|
}
|
||||||
|
}
|
@ -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<Person> {
|
||||||
|
@Override
|
||||||
|
public int compare(Person o1, Person o2) {
|
||||||
|
return new CompareToBuilder()
|
||||||
|
.append(o1.getName(), o2.getName())
|
||||||
|
.append(o1.getAge(), o2.getAge())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
@ -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<Person> {
|
||||||
|
@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();
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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<Comparator<Person>> comparators =
|
||||||
|
Arrays.asList(new CheckFieldsOneByOne(),
|
||||||
|
new ComparisonChainExample(),
|
||||||
|
new CompareToBuilderExample(),
|
||||||
|
ComparatorLambda.createEmployeeComparator());
|
||||||
|
// All comparators should produce the same result
|
||||||
|
for(Comparator<Person> comparator : comparators) {
|
||||||
|
Assertions.assertIterableEquals(
|
||||||
|
Arrays.asList(person1, person2, person3)
|
||||||
|
.stream()
|
||||||
|
.sorted(comparator)
|
||||||
|
.collect(Collectors.toList()),
|
||||||
|
Arrays.asList(person1, person3, person2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user