
import java.util.*;
import java.util.stream.Stream;

class Mar22 {
	public static void main(String[] args) {

		HashMap<String,Integer> hmap = new HashMap<>();
		hmap.put("c",2);
		hmap.put("e",4);
		hmap.put("a",5);
		hmap.put("b",3);
		hmap.put("d",1);

		List<Map.Entry<String,Integer>> list = new ArrayList<>(hmap.entrySet());

		printList(list);

		// sort using Map.Entry provided Comparators

		System.out.println("Sorting with comparingByValue()");
		list.sort(Map.Entry.comparingByValue());
		printList(list);

		System.out.println("Sorting with comparingByKey()");
		list.sort(Map.Entry.comparingByKey());
		printList(list);

		System.out.println("Sorting by value in descending order");
		list.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
		printList(list);

		System.out.println("Sorting with key in reverse order");
		list.sort(Map.Entry.comparingByKey(Comparator.reverseOrder()));
		printList(list);

		// using our own Comparator

		System.out.println("Sorting with value using custom Comparator");
		Comparator<Map.Entry<String,Integer>> comp = (a,b) -> { 
			return a.getValue() - b.getValue(); 
		};

		list.sort(comp);
		printList(list);
	
		// sorting using Streams
                System.out.println("Sorting and printing with Stream");
		hmap.entrySet()
			.stream()
			.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
			.forEach((elm) -> System.out.println(elm.getKey() + " > " + elm.getValue()));
			

	}

	static void printList(List<Map.Entry<String,Integer>> list) {
		for(Map.Entry<String,Integer> entry : list) {
			System.out.println(entry);
		}
	}
}
