Skip to content
Related Articles

Related Articles

Improve Article

Sort an Array of dates in ascending order using Custom Comparator

  • Difficulty Level : Easy
  • Last Updated : 09 Aug, 2021

Given an array arr[] of N dates in the form of “DD-MM-YYYY”, the task is to sort these dates in ascending order.

Examples:  

Input: arr[] = { “25-08-1996”, “03-08-1970”, “09-04-1994” } 
Output: 
03-08-1970 
09-04-1994 
25-08-1996

Input: arr[] = { “03-08-1970”, “09-04-2020”, “19-04-2019″”} 
Output: 
03-08-1970 
19-04-2019 
09-04-2020 

Approach:  



  • Create a Custom comparator function that compares two dates as below: 
    • First compare the year of the two elements. The element with greater year will come after the other element.
    • If the year of both the dates is same then compare the months. The element with a greater month will come after the other element.
    • If the month of both the dates is same then compare the dates. The element with greater date will come after the other element.
  • Then sort the array using the defined custom comparator. In C++, it is done as:

sort(initial position, ending position, comparator) 
 

  • Print the modified array.

Below is the implementation of the above approach: 

C++




// C++ implementation to sort the
// array of dates in the form of
// "DD-MM-YYYY" using custom comparator
 
#include <bits/stdc++.h>
using namespace std;
 
// Comparator to sort the array of dates
int myCompare(string date1,
              string date2)
{
    string day1 = date1.substr(0, 2);
    string month1 = date1.substr(3, 2);
    string year1 = date1.substr(6, 4);
 
    string day2 = date2.substr(0, 2);
    string month2 = date2.substr(3, 2);
    string year2 = date2.substr(6, 4);
 
    // Condition to check the year
    if (year1 < year2)
        return 1;
    if (year1 > year2)
        return 0;
 
    // Condition to check the month
    if (month1 < month2)
        return 1;
    if (month1 > month2)
        return 0;
 
    // Condition to check the day
    if (day1 < day2)
        return 1;
    if (day1 > day2)
        return 0;
}
 
// Function that prints the
// dates in ascensding order
void printDatesAscending(
    vector<string> arr)
{
    // Sort the dates using library
    // sort function with custom Comparator
    sort(arr.begin(), arr.end(), myCompare);
 
    // Loop to print the dates
    for (int i = 0; i < arr.size(); i++)
        cout << arr[i] << "\n";
}
 
// Driver Code
int main()
{
    vector<string> arr;
    arr.push_back("25-08-1996");
    arr.push_back("03-08-1970");
    arr.push_back("09-04-1994");
    arr.push_back("29-08-1996");
    arr.push_back("14-02-1972");
 
    printDatesAscending(arr);
 
    return 0;
}

Java




// Java implementation to sort the
// array of dates in the form of
// "DD-MM-YYYY" using custom comparator
import java.util.*;
import java.lang.*;
 
class GFG{
     
// Function that prints the
// dates in ascensding order
static void printDatesAscending(ArrayList<String> arr)
{
     
    // Sort the dates using library
    // sort function with custom Comparator
    Collections.sort(arr,new Comparator<>()
    {
        public int compare(String date1, String date2)
        {
            String day1 = date1.substring(0, 2);
            String month1 = date1.substring(3, 5);
            String year1 = date1.substring(6);
           
            String day2 = date2.substring(0, 2);
            String month2 = date2.substring(3, 5);
            String year2 = date2.substring(6);
             
            // Condition to check the year
            if (year2.compareTo(year1) > 0)
                return -1;
            else if (year2.compareTo(year1) < 0)
                return 1;
             
            // Condition to check the month    
            else if (month2.compareTo(month1) > 0)
                return -1;
            else if (month2.compareTo(month1) < 0)
                return 1;
             
            // Condition to check the day
            else if (day2.compareTo(day1) > 0)
                return -1;
            else
                return 1;
        }
    });
     
    // Loop to print the dates
    for(int i = 0; i < arr.size(); i++)
        System.out.println(arr.get(i));
 
// Driver code
public static void main(String[] args)
{
    ArrayList<String> arr = new ArrayList<>();
    arr.add("25-08-1996");
    arr.add("03-08-1970");
    arr.add("09-04-1994");
    arr.add("29-08-1996");
    arr.add("14-02-1972");
     
    printDatesAscending(arr);
}
}
 
// This code is contributed by offbeat

Python3




# Python3 implementation to sort the
# array of dates in the form of
# "DD-MM-YYYY" using custom comparator
from functools import cmp_to_key
 
# Comparator to sort the array of dates
def myCompare(date1, date2):
     
    day1 = date1[0 : 2]   
    month1 = date1[3 : 3 + 2]
    year1 = date1[6 : 6 + 4]
     
    day2 = date2[0 : 2]
    month2 = date2[3 : 3 + 2]
    year2 = date2[6 : 6 + 4]
     
    # Condition to check the year
    if (year1 < year2):
        return -1
    if (year1 > year2):
        return 1
         
    # Condition to check the month
    if (month1 < month2):
        return -1
    if (month1 > month2):
        return 1
     
    # Condition to check the day
    if (day1 < day2):
        return -1
    if (day1 > day2):
        return 1
 
# Function that prints the
# dates in ascensding order
def printDatesAscending(arr):
     
    # Sort the dates using library
    # sort function with custom Comparator
    arr = sorted(arr, key = cmp_to_key(
        lambda a, b: myCompare(a, b)))
     
    # Loop to print the dates
    for i in range(len(arr)):
        print(arr[i])
 
# Driver Code
arr = []
arr.append("25-08-1996")
arr.append("03-08-1970")
arr.append("09-04-1994")
arr.append("29-08-1996")
arr.append("14-02-1972")
 
printDatesAscending(arr)
 
# This code is contributed by shubhamsingh10

C#




// C# implementation to sort the
// array of dates in the form of
// "DD-MM-YYYY" using custom comparator
using System;
using System.Collections.Generic;
using System.Linq;
 
class GFG{
     
// Comparator to sort the array of dates
static int myCompare(string date1,
                     string date2)
{
    string day1 = date1.Substring(0, 2);
    string month1 = date1.Substring(3, 2);
    string year1 = date1.Substring(6, 4);
 
    string day2 = date2.Substring(0, 2);
    string month2 = date2.Substring(3, 2);
    string year2 = date2.Substring(6, 4);
 
    // Condition to check the year
    return string.Compare(year1, year2);
 
    // Condition to check the month
    return string.Compare(month1, month2);
 
    // Condition to check the day
    return string.Compare(day1, day2);
}
 
// Function that prints the
// dates in ascensding order
static void printDatesAscending(List<string> arr)
{
     
    // Sort the dates using library
    // sort function with custom Comparator
    arr.Sort(myCompare);
 
    // Loop to print the dates
    for(int i = 0; i < arr.Count; i++)
        Console.WriteLine(arr[i]);
}
 
// Driver Code
static public void Main()
{
    List<string> arr = new List<string>();
    arr.Add("25-08-1996");
    arr.Add("03-08-1970");
    arr.Add("09-04-1994");
    arr.Add("29-08-1996");
    arr.Add("14-02-1972");
 
    printDatesAscending(arr);
}
}
 
// This code is contributed by shubhamsingh10

Javascript




<script>
// Javascript implementation of the above approach
 
// Comparator to sort the array of dates
function myCompare(date1, date2)
{
    var day1 = date1.substr(0, 2);
    var month1 = date1.substr(3, 2);
    var year1 = date1.substr(6, 4);
 
    var day2 = date2.substr(0, 2);
    var month2 = date2.substr(3, 2);
    var year2 = date2.substr(6, 4);
 
    // Condition to check the year
    if (year1 < year2)
        return -1;
    if (year1 > year2)
        return 1;
 
    // Condition to check the month
    if (month1 < month2)
        return -1;
    if (month1 > month2)
        return 1;
 
    // Condition to check the day
    if (day1 < day2)
        return -1;
    if (day1 > day2)
        return 1;
}
 
// Function that prints the
// dates in ascensding order
function printDatesAscending( arr)
{
    var n = arr.length;
    // Sort the dates using library
    // sort function with custom Comparator
    arr.sort(myCompare);
     
    // Loop to print the dates
     
    for (var i = 0; i < n; i++)
        document.write(arr[i] + "<br>");
}
 
// Driver Code
var arr = [];
arr.push("25-08-1996");
arr.push("03-08-1970");
arr.push("09-04-1994");
arr.push("29-08-1996");
arr.push("14-02-1972");
 
printDatesAscending(arr);
</script>
Output: 
03-08-1970
14-02-1972
09-04-1994
25-08-1996
29-08-1996

 

Time Complexity: O(N*logN)
Auxiliary Space: O(1)
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :