การตรวจสอบความถูกต้องของ IPv4
โจทย์
ตรวจสอบว่า IPv4 นั้นถูกต้องหรือไม่ ถ้าถูกแสดง Valid ถ้าไม่ถูกให้แสดง Invalid โดยรูปแบบของ IPv4 นั้นประกอบไปด้วย
[0-255].[0-255].[0-255].[0-255]เช่น 192.168.1.1 1.1.1.1 และ 255.255.255.255
| Input | Output |
|---|---|
| 192.168.1.1 | Valid |
| 1.1.1.1 | Valid |
| 256.1.1.1 | Invalid |
โค้ด
โค้ดตามขอบเขตในคลาสเรียน
import java.util.Scanner;
public class Main {
public static void main (String[] args) {
Scanner scanner = new Scanner(System.in);
String ipV4 = scanner.nextLine();
int startIndex = 0;
int dotIndex = ipV4.indexOf(".");
boolean isValid = true;
for(int i = 0; i < 4; i++) {
int ipPart = Integer.parseInt(ipV4.substring(startIndex, dotIndex));
if (ipPart < 0 || ipPart > 255) {
isValid = false;
break;
}
startIndex = dotIndex + 1;
dotIndex = ipV4.indexOf(".", dotIndex + 1);
if (dotIndex == -1) {
dotIndex = ipV4.length();
}
}
if(isValid) {
System.out.println("Valid");
} else {
System.out.println("Invalid");
}
}
}โค้ดนอกเหนือจากคลาสเรียน
import java.util.Scanner;
public class Main {
public static void main (String[] args) {
Scanner scanner = new Scanner(System.in);
String ipV4 = scanner.nextLine();
String[] ipV4Parts = ipV4.split("\\.");
boolean isValid = true;
for (String part : ipV4Parts) {
int partInt = Integer.parseInt(part);
if (partInt < 0 || partInt > 255) {
isValid = false;
break;
}
}
System.out.println(isValid ? "Valid" : "Invalid");
}
}คำอธิบาย
คำอธิบายโค้ดตามขอบเขตในคลาสเรียน
ขั้นตอนที่ 1: การนำเข้าไลบรารี
import java.util.Scanner;- บรรทัดนี้เป็นการนำเข้าไลบรารีที่ชื่อว่า
Scanner Scannerเป็นเครื่องมือที่ช่วยให้เราสามารถรับข้อมูลจากผู้ใช้ได้- เปรียบเสมือนการหยิบเครื่องอ่านบัตรที่สามารถอ่านข้อมูลที่ผู้ใช้ป้อนเข้ามาได้
ขั้นตอนที่ 2: การสร้างคลาส
public class Main {
// โค้ดอื่นๆ จะอยู่ในนี้
}class Mainคือการสร้างกล่องใหญ่ที่จะเก็บโค้ดทั้งหมดของเรา- คิดเหมือนกับการสร้างห้องทำงานที่ชื่อว่า “Main” ที่เราจะใช้ตรวจสอบ IP address
ขั้นตอนที่ 3: การสร้างเมธอดหลัก
public static void main (String[] args) {
// โค้ดหลักจะอยู่ในนี้
}- นี่คือจุดเริ่มต้นของโปรแกรมของเรา
- เปรียบเสมือนประตูทางเข้าของห้องทำงาน เมื่อเราเปิดโปรแกรม มันจะเริ่มทำงานจากตรงนี้
ขั้นตอนที่ 4: การสร้างตัวรับข้อมูล
Scanner scanner = new Scanner(System.in);- เราสร้างเครื่องมือที่ชื่อว่า
scannerเพื่อรับข้อมูลจากผู้ใช้ - คิดเหมือนกับการเตรียมปากกาและกระดาษไว้พร้อมจดบันทึก IP address ที่ผู้ใช้จะบอกเรา
ขั้นตอนที่ 5: การรับ IP address
String ipV4 = scanner.nextLine();- เราใช้
scannerเพื่ออ่าน IP address ที่ผู้ใช้พิมพ์เข้ามา และเก็บไว้ในตัวแปรipV4 - เปรียบเสมือนการจดบันทึก IP address ที่ผู้ใช้บอกเรา
ขั้นตอนที่ 6: การเตรียมตัวแปรสำหรับการตรวจสอบ
int startIndex = 0;
int dotIndex = ipV4.indexOf(".");
boolean isValid = true;- เราสร้างตัวแปร
startIndexและdotIndexเพื่อใช้ในการแบ่ง IP address isValidใช้เก็บผลการตรวจสอบว่า IP address ถูกต้องหรือไม่- เปรียบเสมือนการเตรียมไม้บรรทัดเพื่อวัดแต่ละส่วนของ IP address
ขั้นตอนที่ 7: การตรวจสอบแต่ละส่วนของ IP
for(int i = 0; i < 4; i++) {
int ipPart = Integer.parseInt(ipV4.substring(startIndex, dotIndex));
if (ipPart < 0 || ipPart > 255) {
isValid = false;
break;
}
startIndex = dotIndex + 1;
dotIndex = ipV4.indexOf(".", dotIndex + 1);
if (dotIndex == -1) {
dotIndex = ipV4.length();
}
}- เราใช้ลูป
forเพื่อตรวจสอบทั้ง 4 ส่วนของ IP address - ในแต่ละรอบ:
- แยกส่วนของ IP ออกมาและแปลงข้อความ String เป็นตัวเลข int โดย
Integer.parseInt() - ตรวจสอบว่าตัวเลขอยู่ระหว่าง 0 ถึง 255 หรือไม่
- ถ้าไม่อยู่ในช่วงนี้ ถือว่าไม่ถูกต้อง
- เลื่อนตำแหน่งการตรวจสอบไปยังส่วนถัดไป
- แยกส่วนของ IP ออกมาและแปลงข้อความ String เป็นตัวเลข int โดย
- เปรียบเสมือนการใช้ไม้บรรทัดวัดแต่ละส่วนของ IP address และตรวจสอบว่าอยู่ในขนาดที่ถูกต้องหรือไม่
ขั้นตอนที่ 8: การแสดงผลลัพธ์
if(isValid) {
System.out.println("Valid");
} else {
System.out.println("Invalid");
}- เราตรวจสอบค่า
isValidและแสดงผลว่า IP address นั้นถูกต้องหรือไม่ - เปรียบเสมือนการประกาศผลการตรวจสอบ IP address ว่าผ่านหรือไม่ผ่าน
โค้ดนอกเหนือจากคลาสเรียน
String[] ipV4Parts = ipV4.split("\\.");
boolean isValid = true;
for (String part : ipV4Parts) {
int partInt = Integer.parseInt(part);
if (partInt < 0 || partInt > 255) {
isValid = false;
break;
}
}
System.out.println(isValid ? "Valid" : "Invalid");ความแตกต่างและเหตุผล:
1. เมธอด split()
เมธอด split() ใช้สำหรับแบ่งสตริง (string) ออกเป็นส่วนๆ โดยใช้ตัวคั่น (delimiter) ที่กำหนด
String[] ipV4Parts = ipV4.split("\\.");วิธีการทำงาน
split()จะมองหาตัวคั่นในสตริง (ในที่นี้คือจุด ”.”)- เมื่อเจอตัวคั่น มันจะตัดสตริงออกเป็นส่วนๆ
- ผลลัพธ์จะเป็นอาร์เรย์ (array) ของสตริงที่ถูกแบ่ง
ตัวอย่าง
ถ้า ipV4 = "192.168.0.1"
หลังจาก split() จะได้ ipV4Parts = ["192", "168", "0", "1"]
เปรียบเทียบแบบง่าย
คิดเหมือนการตัดขนมปังเป็นชิ้นๆ โดยใช้มีด ที่จุดที่เราต้องการตัด
ข้อสังเกต
- เราใช้
\\.แทน.เพราะในภาษา Java จุดเป็นอักขระพิเศษในการเขียน regular expression จึงต้องใช้\\เพื่อบอกว่าเราต้องการใช้จุดจริงๆ
2. ลูป for-each
ลูป for-each เป็นวิธีการวนซ้ำผ่านสมาชิกทั้งหมดของคอลเลกชัน (เช่น อาร์เรย์) โดยไม่ต้องใช้ตัวนับ
for (String part : ipV4Parts) {
// โค้ดที่ต้องการทำซ้ำ
}วิธีการทำงาน
- ลูปจะวนซ้ำผ่านทุกสมาชิกใน
ipV4Parts - ในแต่ละรอบ มันจะนำสมาชิกหนึ่งตัวมาเก็บในตัวแปร
part - เราสามารถใช้
partในการทำงานกับสมาชิกนั้นๆ ได้
เปรียบเทียบแบบง่าย
คิดเหมือนการหยิบลูกบอลออกจากกล่องทีละลูก แล้วทำอะไรบางอย่างกับลูกบอลนั้น จนกว่าจะหยิบครบทุกลูก
ข้อดี
- โค้ดสั้นและอ่านง่ายกว่าลูป for แบบปกติ
- ไม่ต้องกังวลเรื่องการจัดการดัชนี (index)
ข้อจำกัด
- ไม่สามารถควบคุมจำนวนรอบของลูปได้โดยตรง
- ไม่สามารถเข้าถึงดัชนีของสมาชิกได้โดยตรง
3. Ternary Operator
Ternary operator เป็นวิธีการเขียน if-else แบบสั้นๆ ในบรรทัดเดียว
System.out.println(isValid ? "Valid" : "Invalid");วิธีการทำงาน
- มีรูปแบบ:
เงื่อนไข ? ค่าถ้าจริง : ค่าถ้าเท็จ - ถ้าเงื่อนไขเป็นจริง จะคืนค่าหลังเครื่องหมาย
? - ถ้าเงื่อนไขเป็นเท็จ จะคืนค่าหลังเครื่องหมาย
:
เปรียบเทียบแบบง่าย
คิดเหมือนการตั้งคำถาม “ถ้า… แล้ว… ไม่งั้น…” เช่น “ถ้าฝนตก เอาร่ม ไม่งั้นเอาแว่นกันแดด”
ข้อดี
- โค้ดสั้นกว่า if-else แบบปกติ
- เหมาะสำหรับการตัดสินใจง่ายๆ ที่มีเพียงสองทางเลือก
ข้อจำกัด
- อาจอ่านยากถ้าใช้กับเงื่อนไขที่ซับซ้อน
- ไม่เหมาะสำหรับการตัดสินใจที่มีหลายทางเลือก
ตัวอย่างการทำงาน
โค้ดตามขอบเขตในคลาสเรียน
โค้ดนอกเหนือจากคลาสเรียน
ปรับปรุงล่าสุด