String ใน Java เป็น Immutable ไม่สามารถจัดเรียงตัวอักษรภายในได้โดยตรง ต้องแปลงเป็น char[] จัดเรียง แล้วสร้าง String ใหม่
วิธีที่ 1: ใช้ Arrays.sort() (มาตรฐาน เร็วที่สุด)
import java.util.Arrays;
import java.util.Scanner;
public class SortString {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter a string: ");
String str = sc.nextLine();
// 1. String -> char[]
char[] charArray = str.toCharArray();
// 2. Sort char[]
Arrays.sort(charArray); // Dual-Pivot Quicksort (Java 7+)
// 3. char[] -> String
String sorted = new String(charArray);
System.out.println("Sorted: " + sorted);
}
}
ตัวอย่าง
Enter a string: Tutorialspoint Sorted: Taiilnooprsttu
วิธีที่ 2: ใช้ Stream API (Java 8+)
String sorted = str.chars() // IntStream ของ char code
.sorted() // เรียงลำดับ
.collect(StringBuilder::new, // Collector
StringBuilder::appendCodePoint,
StringBuilder::append)
.toString();
วิธีที่ 3: Manual Sort (การศึกษา/อัลกอริทึม)
public static String manualSort(String str) {
char[] arr = str.toCharArray();
int n = arr.length;
// Bubble Sort (ตัวอย่างง่าย)
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
char temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return new String(arr);
}
ข้อควรระวัง
- Case Sensitivity:
Arrays.sort()เรียงตาม Unicode Value -> ตัวใหญ่ (A-Z: 65-90) จะอยู่ก่อนตัวเล็ก (a-z: 97-122) - ถ้าต้องการ Case-Insensitive: แปลงเป็น Lower/Upper ก่อน Sort หรือใช้ Custom Comparator (แต่ char[] ไม่มี Comparator ต้องแปลงเป็น Object[] หรือใช้ Stream)
Case-Insensitive Sort (Java 8+)
String caseInsensitiveSorted = str.chars()
.mapToObj(c -> (char) c)
.sorted(Character::compareIgnoreCase)
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
.toString();
สรุป
ใช้ Arrays.sort(str.toCharArray()) สำหรับกรณีทั่วไป เร็วที่สุดและเป็นมาตรฐาน สำหรับ Case-Insensitive ใช้ Stream API กับ Character::compareIgnoreCase