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
*/