Skip to content

Commit 873fefc

Browse files
authored
Merge pull request #43 from amitrp/aph-15360_sort_object_collections_with_multiple_fields
aph-15360 Sort Object Collections using multiple fields
2 parents fce6e1c + 940560a commit 873fefc

File tree

4 files changed

+110
-0
lines changed

4 files changed

+110
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ This project contains Core Java code samples that are used as examples on [amitp
125125

126126
### [Case-Insensitive Search in Java ArrayLists](https://www.amitph.com/java-arraylists-case-insensitive-search/)
127127

128+
### [Sorting Collection of Objects by Multiple Fields in Java](https://www.amitph.com/java-collection-sort-multiple-fields/)
129+
128130
## How to use
129131
*Clone the project using*
130132
```

java-collections/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ This project contains Java Collections code samples that are used as examples on
8888

8989
### [Case-Insensitive Search in Java ArrayLists](https://www.amitph.com/java-arraylists-case-insensitive-search/)
9090

91+
### [Sorting Collection of Objects by Multiple Fields in Java](https://www.amitph.com/java-collection-sort-multiple-fields/)
9192

9293
## How to use
9394
*Clone the project using*

java-collections/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
<artifactId>commons-collections4</artifactId>
3333
<version>4.4</version>
3434
</dependency>
35+
<dependency>
36+
<groupId>org.apache.commons</groupId>
37+
<artifactId>commons-lang3</artifactId>
38+
<version>3.12.0</version>
39+
</dependency>
3540
<dependency>
3641
<groupId>junit</groupId>
3742
<artifactId>junit</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package com.amitph.java.collections;
2+
3+
import com.google.common.collect.ComparisonChain;
4+
import lombok.Getter;
5+
import lombok.RequiredArgsConstructor;
6+
import lombok.ToString;
7+
import org.apache.commons.lang3.builder.CompareToBuilder;
8+
9+
import java.util.ArrayList;
10+
import java.util.Comparator;
11+
import java.util.List;
12+
13+
@RequiredArgsConstructor
14+
public class MultiFieldSorter {
15+
private final List<Student> collection = new ArrayList<>(List.of(
16+
new Student(1L, "Ray", 18),
17+
new Student(2L, "Bee", 18),
18+
new Student(3L, "Ray", 17),
19+
new Student(4L, "Bia", 15),
20+
new Student(5L, "Ria", 15)
21+
));
22+
23+
public void sortUsingComparator_Field_by_Field() {
24+
collection.sort(new SimpleComparator());
25+
collection.forEach(System.out::println);
26+
}
27+
28+
public void sortUsingComparator_Guava_ComparisonChain() {
29+
collection.sort(new GuavaBasedComparator());
30+
collection.forEach(System.out::println);
31+
}
32+
33+
public void sortUsingComparator_Commons_CompareToBuilder() {
34+
collection.sort(new ApacheCommonsBasedComparator());
35+
collection.forEach(System.out::println);
36+
}
37+
38+
public void sortUsingComparator_Comparing() {
39+
collection.sort(Comparator
40+
.comparing(Student::getName)
41+
.thenComparing(Student::getAge));
42+
collection.forEach(System.out::println);
43+
}
44+
45+
public static void main(String[] a) {
46+
MultiFieldSorter sorter = new MultiFieldSorter();
47+
48+
System.out.println("Custom Comparator - Simple");
49+
sorter.sortUsingComparator_Field_by_Field();
50+
51+
System.out.println();
52+
System.out.println("Custom Comparator - Guava ComparisonChain");
53+
sorter.sortUsingComparator_Guava_ComparisonChain();
54+
55+
System.out.println();
56+
System.out.println("Custom Comparator - Commons CompareToBuilder");
57+
sorter.sortUsingComparator_Commons_CompareToBuilder();
58+
59+
System.out.println();
60+
System.out.println("Comparator Factory - Comparator.comparing()");
61+
sorter.sortUsingComparator_Comparing();
62+
}
63+
}
64+
65+
@ToString
66+
@Getter
67+
@RequiredArgsConstructor
68+
class Student {
69+
private final long id;
70+
private final String name;
71+
private final int age;
72+
}
73+
74+
class SimpleComparator implements Comparator<Student> {
75+
@Override
76+
public int compare(Student o1, Student o2) {
77+
int difference = o1.getName().compareTo(o2.getName());
78+
79+
return (difference != 0) ? difference
80+
: Integer.compare(o1.getAge(), o2.getAge());
81+
}
82+
}
83+
84+
class GuavaBasedComparator implements Comparator<Student> {
85+
@Override
86+
public int compare(Student o1, Student o2) {
87+
return ComparisonChain.start()
88+
.compare(o1.getName(), o2.getName())
89+
.compare(o1.getAge(), o2.getAge())
90+
.result();
91+
}
92+
}
93+
94+
class ApacheCommonsBasedComparator implements Comparator<Student> {
95+
@Override
96+
public int compare(Student o1, Student o2) {
97+
return new CompareToBuilder()
98+
.append(o1.getName(), o2.getName())
99+
.append(o1.getAge(), o2.getAge())
100+
.build();
101+
}
102+
}

0 commit comments

Comments
 (0)