Open In App

Sort file names in lexicographical order of their extensions

Last Updated : 09 Mar, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array of strings Files[], representing name of some files, the task is to sort the array based on the lexicographical order of the extensions of the file names. If more than one files have the same extension, then sort them in lexicographically.

Examples:

Input: files[] = {“ajay.cpp”, “pchy.pdf”, “loki.docx”, “raju.zip” } 
Output: ajay.cpp, loki.docx, pchy.pdf, raju.zip 
Explanation: 
Lexicographically sorted order of “cpp” < “docx” < “pdf” < “zip”

Input: files[] = {“abc.cpp”, “bcd.cpp”, “ab.cpp”, “efg.zip”} 
Output: ab.cpp, abc.cpp, bcd.cpp, efg.zip 
Explanation: 
Since the file names { “abc.cpp”, “bcd.cpp”, “ab.cpp” } have same extension, they are sorted lexicographical order of their names. 
 

Approach: Follow the steps below to solve the problem:

Below is the implementation of the above approach:

C++




// C++ Program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Comparator function to sort an array of strings
// based on the extension of their file names
bool custom(string s1, string s2)
{
 
    // Stores index of '.' in s1
    size_t i = s1.find('.');
 
    // Stores index of '.' in s2
    size_t j = s2.find('.');
 
    // Stores name of extension of s2
    string d = s1.substr(i + 1);
 
    // Stores name of extension of s2
    string e = s2.substr(j + 1);
 
    // If both files have the
    // same extension name
    if (d == e) {
 
        // Return lexicographically
        // smaller of the two strings
        return s1 < s2;
    }
 
    return d < e;
}
 
// Function to sort the files names
// based on the name of their extension
void sortfromextension(vector<string>& files)
{
 
    // Sort file names in lexicographical
    // order of their extensions
    sort(files.begin(), files.end(), custom);
 
    // Print files in sorted form
    // based on extension names
    for (auto s : files) {
        cout << s << ", ";
    }
}
 
// Driver Code
int main()
{
    vector<string> files
        = { "ajay.cpp", "pchy.pdf",
            "loki.docx", "raju.zip" };
 
    sortfromextension(files);
    return 0;
}


Java




// Java program for above approach
import java.util.*;
import java.lang.*;
class GFG
{
 
  // Function to sort the files names
  // based on the name of their extension
  static void sortfromextension(String[] files)
  {
 
    // Sort file names in lexicographical
    // order of their extensions
    Arrays.sort(files, new Comparator<String>(){
 
      public int compare(String s1,String s2){
 
        // Stores index of '.' in s1
        int i = s1.indexOf('.');
 
        // Stores index of '.' in s2
        int j = s2.indexOf('.');
 
        // Stores name of extension of s2
        String d = s1.substring(i + 1);
 
        // Stores name of extension of s2
        String e = s2.substring(j + 1);  
        return (d.equals(e))?(s1.compareTo(s2)<0?-1:1):(d.compareTo(e)<0?-1:1);
      }
 
    });
 
    // Print files in sorted form
    // based on extension names
    for (int i = 0; i < files.length - 1; i++)
    {
      System.out.print(files[i] + ", ");
    }
    System.out.print(files[files.length - 1]);
  }
  // Driver function
  public static void main (String[] args)
  {
    String[] files
      = { "ajay.cpp", "pchy.pdf",
         "loki.docx", "raju.zip" };
 
    sortfromextension(files);
  }
}
 
// This code is contributed by offbeat


C#




using System;
using System.Linq;
 
class Program
{
    // Function to sort the files names
    // based on the name of their extension
    static void SortFromExtension(string[] files)
    {
        // Sort file names in lexicographical
        // order of their extensions
        Array.Sort(files, (s1, s2) =>
        {
            // Stores index of '.' in s1
            int i = s1.IndexOf('.');
 
            // Stores index of '.' in s2
            int j = s2.IndexOf('.');
 
            // Stores name of extension of s2
            string d = s1.Substring(i + 1);
 
            // Stores name of extension of s2
            string e = s2.Substring(j + 1);
            return (d == e) ? string.Compare(s1, s2, StringComparison.Ordinal) : string.Compare(d, e, StringComparison.Ordinal);
        });
 
        // Print files in sorted form
        // based on extension names
        Console.WriteLine(string.Join(", ", files));
    }
 
    static void Main(string[] args)
    {
        string[] files =
        {
            "ajay.cpp", "pchy.pdf",
            "loki.docx", "raju.zip"
        };
 
        SortFromExtension(files);
    }
}


Python3




# Python
import re
 
def SortFromExtension(files):
    # Sort file names in lexicographical
    # order of their extensions
    files.sort(key=lambda s: re.split("\.([^.]+)", s)[1])
 
    # Print files in sorted form
    # based on extension names
    print(", ".join(files))
 
if __name__ == "__main__":
    files = ["ajay.cpp", "pchy.pdf", "loki.docx", "raju.zip"]
    SortFromExtension(files)
#contributed by akashish__


Javascript




// Javascript program for the above approach
 
function SortFromExtension(files) {
    // Sort file names in lexicographical
    // order of their extensions
    files.sort(function(a, b) {
    let ext1 = a.split('.').pop();
    let ext2 = b.split('.').pop();
    if (ext1 < ext2) {
        return -1;
    } else if (ext1 > ext2) {
        return 1;
    } else {
        return a.localeCompare(b);
    }
});
 
    // Print files in sorted form
    // based on extension names
    console.log(files.join(', '));
}
 
let files = ["ajay.cpp", "pchy.pdf", "loki.docx", "raju.zip"];
SortFromExtension(files);
 
 
// This code is contributed by rishabmalhdjio


Output

ajay.cpp, loki.docx, pchy.pdf, raju.zip, 

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



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads