Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีจัดเรียง String ตามตัวอักษรใน Java

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