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

กลับลำดับ String ใน Java: เทคนิคหลากหลาย ตั้งแต่ง่ายจนถึง Java 8 Stream

การกลับลำดับ String (Reverse String) เป็นคำถามสัมภาษณ์ Java ยอดนิยม บทความนี้รวบรวมวิธีการหลากหลาย ตั้งแต่ built-in method, recursion, loop, จนถึง Java 8 Stream

วิธีที่ 1: StringBuilder.reverse() - ง่ายที่สุด ✅ แนะนำ

public class ReverseString {
    public static String reverse(String input) {
        return new StringBuilder(input).reverse().toString();
    }
    
    public static void main(String[] args) {
        System.out.println(reverse("Hello World")); // dlroW olleH
        System.out.println(reverse("robot"));       // tobor
    }
}

ข้อดี: อ่านง่าย ประสิทธิภาพดี (O(n)) เป็น built-in

วิธีที่ 2: For Loop แบบคลาสสิก

public static String reverse(String input) {
    StringBuilder sb = new StringBuilder();
    for (int i = input.length() - 1; i >= 0; i--) {
        sb.append(input.charAt(i));
    }
    return sb.toString();
}

วิธีที่ 3: toCharArray() + For-Each Loop

public static String reverse(String input) {
    String reversed = "";
    for (char c : input.toCharArray()) {
        reversed = c + reversed; // prepend character
    }
    return reversed;
}

⚠️ คำเตือน: วิธีนี้สร้าง String object ใหม่ทุกครั้งใน loop (O(n²)) ไม่แนะนำสำหรับ String ยาว

วิธีที่ 4: Recursion (ฟังก์ชันเรียกตัวเอง)

public static String reverse(String input) {
    if (input.isEmpty()) {
        return input;
    }
    return reverse(input.substring(1)) + input.charAt(0);
}

// หรือ version tail-recursive (แต่ Java ไม่ optimize tail call)
public static String reverseRecursive(String input) {
    return reverseHelper(input, "");
}

private static String reverseHelper(String remaining, String reversed) {
    if (remaining.isEmpty()) {
        return reversed;
    }
    return reverseHelper(remaining.substring(1), remaining.charAt(0) + reversed);
}

วิธีที่ 5: Java 8 Stream API

import java.util.stream.Collectors;
import java.util.stream.IntStream;

public static String reverse(String input) {
    return IntStream.range(0, input.length())
        .mapToObj(i -> input.charAt(input.length() - 1 - i))
        .map(String::valueOf)
        .collect(Collectors.joining());
}

Benchmark: เปรียบเทียบประสิทธิภาพ

วิธีTime ComplexitySpace Complexityคำแนะนำ
StringBuilder.reverse()O(n)O(n)✅ ใช้งานจริง
For Loop + StringBuilderO(n)O(n)เข้าใจหลักการ
toCharArray + String concatO(n²)O(n²)❌ หลีกเลี่ยง
RecursionO(n)O(n) stackสอบสัมภาษณ์
Java 8 StreamO(n)O(n)Functional style

Unit Test ตัวอย่าง (JUnit 5)

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class ReverseStringTest {
    @Test
    void testReverse() {
        assertEquals("tobor", ReverseString.reverse("robot"));
        assertEquals("dlroW olleH", ReverseString.reverse("Hello World"));
        assertEquals("", ReverseString.reverse(""));
        assertEquals("a", ReverseString.reverse("a"));
        assertEquals("12345", ReverseString.reverse("54321"));
    }
}

บทความเกี่ยวข้อง