/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		List<List<String>> data = new ArrayList<>();
        List<String> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<String> list3 = new ArrayList<>();

        list1.add("Siva");
        list1.add("20");
        list1.add("Hyd");
        list1.add("TA");
        list1.add("India");

        list2.add("Suresh");
        list2.add("22");
        list2.add("Banglore");
        list2.add("KA");
        list2.add("India");

        list3.add("Ramesh");
        list3.add("24");
        list3.add("Chennai");
        list3.add("TN");
        list3.add("India");

        data.add(list1);
        data.add(list2);
        data.add(list3);
        
        List<List<String>> listSorted1 = data.stream()
                .sorted((x, y) -> {
                    int res = x.get(0).compareTo(y.get(0));
                    if (res != 0) return res;
                    res = Integer.valueOf(x.get(1)).compareTo(Integer.valueOf(y.get(1)));
                    if (res != 0) return res;
                    return x.get(2).compareTo(y.get(2));
                })
                .collect(Collectors.toList());
                
        System.out.println("Sorting without mapping: \n" + listSorted1);

        List<MyClass> listSorted2 = data.stream()
                .map(list -> MyClass.createMyClass(list))
                .sorted(Comparator.comparing(MyClass::getName).thenComparing(MyClass::getAge).thenComparing(MyClass::getCity))
                .collect(Collectors.toList());

        System.out.println("\nSorting with mapping: \n" + listSorted2);
	}
	
	static class MyClass {
        String name;
        int age;
        String city, code, country;

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }

        public String getCity() {
            return city;
        }

        public String getCode() {
            return code;
        }

        public String getCountry() {
            return country;
        }

        public static MyClass createMyClass(List<String> list) {
            if (list == null || list.size() < 5) {
                return null;
            }

            MyClass mc = new MyClass();
            mc.name = list.get(0);
            mc.age = Integer.valueOf(list.get(1));
            mc.city = list.get(2);
            mc.code = list.get(3);
            mc.country = list.get(4);

            return mc;
        }

        @Override
        public String toString() {
            return String.format("(%s %d %s %s %s)", name, age, city, code, country);
        }
    }
}