โจทย์: 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(" "));
}