Sunday, 24 May 2020

Comparator and Comparable interface:



Java String class implements the Comparable interface, you can sort them in their natural order, using the Collections sort() method.

if you want to sort the user defined objects in another order than their compare() implementation, then you need to use a Comparator implementation (java.util.Comparator)

Usual Implementation in Java 7:

import java.util.*;
public class Main
{
public static void main(String[] args) {
    List<Car> list = new ArrayList<>();

            list.add(new Car("Volvo V40" , "XYZ 201845", 5));
            list.add(new Car("Citroen C1", "ABC 164521", 4));
                ist.add(new Car("Dodge Ram" , "KLM 845990", 2));
Collections.sort(list, new BrandCompare());
for(Car lst: list){
    System.out.println(lst.brand);
}
}
}
class Car{
    public String brand;
    public String numberPlate;
    public int noOfDoors;

    public Car(String brand, String numberPlate, int noOfDoors) {
        this.brand = brand;
        this.numberPlate = numberPlate;
        this.noOfDoors = noOfDoors;
    }
}
class BrandCompare implements Comparator<Car>{
    
    public int compare(Car car1, Car car2) {
        return car1.brand.compareTo(car2.brand);
    }
}
class PlateCompare implements Comparator<Car>{
    
    public int compare(Car car1, Car car2) {
        return car1.numberPlate.compareTo(car2.numberPlate);
    }
}

Implementation in external class:

List<Car> list = new ArrayList<>();

list.add(new Car("Volvo V40" , "XYZ 201845", 5));
list.add(new Car("Citroen C1", "ABC 164521", 4));
list.add(new Car("Dodge Ram" , "KLM 845990", 2));

Comparator<Car> carBrandComparator = new Comparator<Car>() {
    @Override
    public int compare(Car car1, Car car2) {
        return car1.brand.compareTo(car2.brand);
    }
};

Collections.sort(list, carBrandComparator);


Implementation in external class using lambda experession:

List<Car> list = new ArrayList<>();

list.add(new Car("Volvo V40" , "XYZ 201845", 5));
list.add(new Car("Citroen C1", "ABC 164521", 4));
list.add(new Car("Dodge Ram" , "KLM 845990", 2));


Comparator<Car> carBrandComparatorLambda      =
    (car1, car2) -> car1.brand.compareTo(car2.brand);

Comparator<Car> carNumberPlatComparatorLambda =
    (car1, car2) -> car1.numberPlate.compareTo(car2.numberPlate);

Comparator<Car> carNoOfDoorsComparatorLambda  =
    (car1, car2) -> car1.noOfDoors - car2.noOfDoors;

Collections.sort(list, carBrandComparatorLambda);
Collections.sort(list, carNumberPlatComparatorLambda);
Collections.sort(list, carNoOfDoorsComparatorLambda);

We can also make use of getter method in bean to specify comparator field:

class Car{
    public String brand;
    public String numberPlate;
    public int noOfDoors;
    
    public String getBrand(){
        return this.brand;
    }
}

List<Car> list = new ArrayList<>();

list.add(new Car("Volvo V40" , "XYZ 201845", 5));
list.add(new Car("Citroen C1", "ABC 164521", 4));
list.add(new Car("Dodge Ram" , "KLM 845990", 2));

Comparator<Car> brandCompare =Comparator.comparing(Car::getBrand);  
 Collections.sort(al,brandCompare); 

Thursday, 21 May 2020

Running time of Java Iterator


Happy to see you after a long time. I have started working on Java collections and I have tried measuring retrieval time for each collection iterator types using 1000 records in Java 8 and found below time(in seconds) for iteration.

 List Name\Iterator types Iterator    Foreach For loop
 Array List 0.0856     0.044 0.0491
 Linked List 0.02867 0.0504 0.0467
 Vector 0.0342 0.0444 0.0584
 
I have also tried to use for-each lambda expression, this gives below time for each list collection:

Vector - 0.17455
Linked List - 0.17691
Array List - 0.18599

Retrieval time for binarySearch() in collection:

Vector - 0.00377
Linked List - 0.00377
Array List - 0.01069