Using Comparator in HashMap will show you how to use Comparator
to sort values in HashMap
. We will use custom object as a key in the HashMap. The object which is used as an object as a key in HashMap must override hashCode()
and equals()
methods.
Prerequisites
Knowledge of Java
Related Posts:
Creating POJO Class
We will create a simple POJO class Book that will act as a key in HashMap. That’s why we are overriding hashCode()
and equals()
method here in the Book class.
We will check both title
and author
attributes for the equality check of the two Book
objects.
If you are using Eclipse then you can generate these two methods – hashCode()
and equals()
– from the option.
Shortcut keys in Windows system in Eclipse are Alt + Shift + S. On popup window click on Generate hashCode() and equals().
package com.roytuts.java.comparator.in.hashmap;
public class Book {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((author == null) ? 0 : author.hashCode());
result = prime * result + ((title == null) ? 0 : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (author == null) {
if (other.author != null)
return false;
} else if (!author.equals(other.author))
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
}
@Override
public String toString() {
return "Book [title=" + title + ", author=" + author + "]";
}
}
Creating Main Class
Create below main class which will test the user defined objects as keys in HashMap.
We will also use Comparator
to sort the elements in HashMap
.
We are using here Collections.sort()
method to sort our list of Book
objects.
package com.roytuts.java.comparator.in.hashmap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class HashMapComparator {
public static void main(String[] args) {
Map<Book, String> bookMap = new HashMap<>();
bookMap.put(new Book("Java", "James Gosling"), "Java");
bookMap.put(new Book("C++", "Bjourn Stroustup"), "C++");
bookMap.put(new Book("C", "Denish Ritche"), "C");
bookMap.put(new Book("Databse", "C J Date"), "Database");
System.out.println("Unsorted HashMap Values");
System.out.println("-----------------------");
bookMap.forEach((k, v) -> System.out.println(k + " => " + v));
System.out.println();
Set<Entry<Book, String>> set = bookMap.entrySet();
List<Entry<Book, String>> list = new ArrayList<Entry<Book, String>>(set);
Collections.sort(list, new Comparator<Map.Entry<Book, String>>() {
@Override
public int compare(Entry<Book, String> b1, Entry<Book, String> b2) {
return (b1.getValue()).compareTo(b2.getValue());
}
});
System.out.println("Sorted HashMap Values");
System.out.println("---------------------");
list.forEach(item -> System.out.println(item.getKey() + " => " + item.getValue()));
}
}
Using the lambda expression you can replace the below code snippets in the above class.
The Comparator
interface is a functional interface and it has only one method and annotated with @FunctionalInterface
so that no further new method can be added and lambda expression can be used easily.
Collections.sort(list, new Comparator<Map.Entry<Book, String>>() {
@Override
public int compare(Entry<Book, String> b1, Entry<Book, String> b2) {
return (b1.getValue()).compareTo(b2.getValue());
}
});
by
Collections.sort(list, (b1, b2) -> (b1.getValue()).compareTo(b2.getValue()));
Testing the Program
Run the above main class and you will get the below output:
Unsorted HashMap Values
-----------------------
Book [title=C++, author=Bjourn Stroustup] => C++
Book [title=Java, author=James Gosling] => Java
Book [title=C, author=Denish Ritche] => C
Book [title=Databse, author=C J Date] => Database
Sorted HashMap Values
---------------------
Book [title=C, author=Denish Ritche] => C
Book [title=C++, author=Bjourn Stroustup] => C++
Book [title=Databse, author=C J Date] => Database
Book [title=Java, author=James Gosling] => Java
Source Code
You can download source code.
Thanks for reading.