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

โปรแกรม Java ขยาย Range ใน String (เช่น 1-4 → 1 2 3 4)

โจทย์: Parse String ที่มี Range (1-4, 56-57) ขยายเป็นตัวเลขทุกตัว

ตัวอย่างโค้ด


public class Demo {
    public static String expandRanges(String input) {
        if (input == null || input.isEmpty()) return "";
        
        StringBuilder sb = new StringBuilder();
        String[] parts = input.split("\\s*,\\s*"); // split by comma, optional spaces
        
        for (String part : parts) {
            String[] range = part.split("-");
            if (range.length == 2) {
                try {
                    int start = Integer.parseInt(range[0].trim());
                    int end = Integer.parseInt(range[1].trim());
                    
                    if (start <= end) {
                        for (int i = start; i <= end; i++) {
                            sb.append(i).append(' ');
                        }
                    } else {
                        // Descending range (optional)
                        for (int i = start; i >= end; i--) {
                            sb.append(i).append(' ');
                        }
                    }
                } catch (NumberFormatException e) {
                    sb.append(part).append(' '); // ไม่ใช่ตัวเลข เก็บไว้ as-is
                }
            } else {
                sb.append(part).append(' '); // ไม่มี dash
            }
        }
        
        return sb.toString().trim();
    }
    
    public static void main(String[] args) {
        String input = "1-4, 56-57, 99-101, 0-1";
        System.out.println("Input: " + input);
        System.out.println("Expanded: " + expandRanges(input));
    }
}

ผลลัพธ์

Input: 1-4, 56-57, 99-101, 0-1
Expanded: 1 2 3 4 56 57 99 100 101 0 1

Edge Cases ที่ควรจัดการ

  • Invalid format: "1-2-3", "a-b" → เก็บต้นฉบับ
  • Spaces: "1 - 4" → ใช้ trim()
  • Negative numbers: "-5--2" → regex split ต้องระวัง (ใช้ split("-", 2) หรือ regex advance)
  • Large ranges: memory issue ถ้าสร้าง string ใหญ่เกิน → ใช้ Iterator/Stream แทน

Stream Version (Java 8+)


public static String expandRangesStream(String input) {
    return Arrays.stream(input.split("\\s*,\\s*"))
        .flatMap(part -> {
            String[] r = part.split("-", 2);
            if (r.length == 2) {
                try {
                    int start = Integer.parseInt(r[0].trim());
                    int end = Integer.parseInt(r[1].trim());
                    return (start <= end) 
                        ? IntStream.rangeClosed(start, end).boxed()
                        : IntStream.iterate(start, i -> i >= end, i -> i - 1).boxed();
                } catch (NumberFormatException e) {
                    return Stream.of(part.trim());
                }
            }
            return Stream.of(part.trim());
        })
        .map(Object::toString)
        .collect(Collectors.joining(" "));
}