How to sort a string in the order: lowercase letters - uppercase letters - odd digits - even digits in Java

1 Answer

0 votes
import java.util.Arrays;

public class SortAlphaNumeric {

    /**
        We want to sort characters in this strict order:
        1. lowercase letters   (a–z)
        2. uppercase letters   (A–Z)
        3. odd digits          (1,3,5,7,9)
        4. even digits         (0,2,4,6,8)

        Strategy:
        ---------
        Assign each character a "category rank" and sort by:
            (category rank, natural character order)

        Because Arrays.sort(char[]) cannot take a Comparator,
        we use Character[] instead, which supports custom comparators.
    */

    // Returns category rank for sorting.
    // Lower rank = comes earlier.
    static int category(char c) {
        if (c >= 'a' && c <= 'z') return 0;   // lowercase
        if (c >= 'A' && c <= 'Z') return 1;   // uppercase
        if (c >= '0' && c <= '9') {
            int d = c - '0';
            return (d % 2 == 1) ? 2 : 3;      // odd digits → 2, even digits → 3
        }
        return 4; // fallback (should not happen for alphanumeric input)
    }

    // Custom comparator for sorting characters
    static int compareChars(char a, char b) {
        int ca = category(a);
        int cb = category(b);

        if (ca != cb)
            return ca - cb;   // sort by category first

        return a - b;         // tie-breaker: natural order
    }

    public static void main(String[] args) {

        String s = "a2B3cD8f1Z0";

        // Convert String to Character[] (object type, needed for Comparator)
        Character[] arr = new Character[s.length()];
        for (int i = 0; i < s.length(); i++) {
            arr[i] = s.charAt(i);
        }

        // Sort using our custom comparator (lambda)
        Arrays.sort(arr, (a, b) -> compareChars(a, b));

        // Build result string from sorted Character[]
        StringBuilder result = new StringBuilder(arr.length);
        for (Character c : arr) {
            result.append(c);
        }

        System.out.println("Sorted result: " + result);
    }
}


/*
run:

Sorted result: acfBDZ13028

*/

 



answered Jul 14 by avibootz

Related questions

...