โปรแกรมเปรียบเทียบสตริงภาษา Java
โจทย์
คุณวงศ์ เป็นนักพัฒนาซอฟต์แวร์ที่กำลังทำงานในโครงการที่เกี่ยวข้องกับการประมวลผลข้อมูลที่ป้อนโดยผู้ใช้ เขาต้องการโปรแกรมที่สามารถเปรียบเทียบสตริงสองตัวและดำเนินการต่างๆ ตามผลลัพธ์ของการเปรียบเทียบ โดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก คุณวงศ์ได้ขอความช่วยเหลือจากคุณในการเขียนโปรแกรมนี้
ข้อกำหนด
- เปรียบเทียบสตริงสองตัวเพื่อตรวจสอบว่าเท่ากันหรือไม่ โดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก
- ถ้าสตริงเท่ากัน ให้แสดง “The strings are equal.”
- ถ้าสตริงไม่เท่ากัน ให้แสดง “The strings are not equal.” และเปรียบเทียบความยาวของสตริงต่อ:
- ถ้าสตริงแรกยาวกว่า ให้แสดง “The first string is longer.”
- ถ้าสตริงที่สองยาวกว่า ให้แสดง “The second string is longer.”
- ถ้าสตริงทั้งสองมีความยาวเท่ากันแต่เนื้อหาต่างกัน ให้แสดง “The strings have the same length but different content.”
- นอกจากนี้ ให้ทำการเปรียบเทียบแบบ lexicographical โดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก:
- ถ้าสตริงแรกมาก่อนสตริงที่สองในการเรียงลำดับ lexicographical ให้แสดง “The first string comes before the second string lexicographically.”
- ถ้าสตริงแรกมาหลังสตริงที่สองในการเรียงลำดับ lexicographical ให้แสดง “The first string comes after the second string lexicographically.”
| Input | Result |
|---|---|
| hello hello | The strings are equal. |
| longerString short | The strings are not equal. The first string is longer. The first string comes before the second string lexicographically. |
| Pear bear | The strings are not equal. The strings have the same length but different content. The first string comes after the second string lexicographically. |
โค้ด
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String firstText = scanner.nextLine();
String secondText = scanner.nextLine();
if (firstText.equalsIgnoreCase(secondText)) {
System.out.println("The strings are equal.");
} else {
System.out.println("The strings are not equal.");
int firstTextLength = firstText.length();
int secondTextLength = secondText.length();
if (firstTextLength > secondTextLength) {
System.out.println("The first string is longer.");
} else if (firstTextLength < secondTextLength) {
System.out.println("The second string is longer.");
} else {
System.out.println("The strings have the same length but different content.");
}
int compare = firstText.compareToIgnoreCase(secondText);
if (compare > 0) {
System.out.println("The first string comes after the second string lexicographically.");
} else if (compare < 0) {
System.out.println("The first string comes before the second string lexicographically.");
}
}
}
}คำอธิบาย
-
เริ่มต้นด้วยการนำเข้าคลาส
Scannerเพื่อรับข้อมูลจากผู้ใช้ -
สร้างออบเจกต์
Scannerเพื่อรับข้อมูลจากSystem.in -
รับข้อความสองบรรทัดจากผู้ใช้และเก็บไว้ในตัวแปร
firstTextและsecondText -
ใช้เมธอด
equalsIgnoreCase()เพื่อเปรียบเทียบสตริงทั้งสองโดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก
- ถ้าเท่ากัน แสดง “The strings are equal.”
- ถ้าไม่เท่ากัน ดำเนินการต่อไปนี้:
-
แสดง “The strings are not equal.”
-
เปรียบเทียบความยาวของสตริงทั้งสอง:
- ถ้า
firstTextยาวกว่า แสดง “The first string is longer.” - ถ้า
secondTextยาวกว่า แสดง “The second string is longer.” - ถ้ายาวเท่ากัน แสดง “The strings have the same length but different content.”
- ใช้เมธอด
compareToIgnoreCase()เพื่อเปรียบเทียบสตริงแบบ lexicographical โดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก:
- ถ้าผลลัพธ์มากกว่า 0 แสดงว่า
firstTextมาหลังsecondTextในการเรียงลำดับ - ถ้าผลลัพธ์น้อยกว่า 0 แสดงว่า
firstTextมาก่อนsecondTextในการเรียงลำดับ
การเปรียบเทียบแบบ Lexicographical คืออะไร
การเปรียบเทียบแบบ lexicographical หรือ lexicographic order เป็นวิธีการเรียงลำดับคำหรือสตริงที่คล้ายกับการเรียงคำในพจนานุกรม ซึ่งเป็นแนวคิดสำคัญในการเขียนโปรแกรมและการจัดการข้อมูล
คำอธิบาย
- เปรียบเสมือนการเรียงคำในพจนานุกรม:
- ลองนึกถึงวิธีที่คำถูกเรียงในพจนานุกรม คำว่า “apple” จะมาก่อน “banana” เสมอ
- เปรียบเทียบทีละตัวอักษร:
- เริ่มจากตัวอักษรแรกของแต่ละคำ
- ถ้าตัวอักษรเหมือนกัน ให้เปรียบเทียบตัวถัดไป
- ทำแบบนี้ไปเรื่อยๆ จนกว่าจะพบตัวอักษรที่ต่างกัน
- ตัวอักษรที่มาก่อนในพจนานุกรมถือว่า “น้อยกว่า”:
- ‘a’ < ‘b’ < ‘c’ < … < ‘z’
- ตัวพิมพ์ใหญ่จะมาก่อนตัวพิมพ์เล็กเสมอ: ‘A’ < ‘a’
- ความยาวมีผล:
- ถ้าสตริงหนึ่งเป็นส่วนหนึ่งของอีกสตริงหนึ่ง สตริงที่สั้นกว่าจะมาก่อน
- เช่น “cat” มาก่อน “category”
ตัวอย่างการเปรียบเทียบ
- “apple” < “banana” (เพราะ ‘a’ มาก่อน ‘b’)
- “apple” < “apples” (เพราะ “apple” สั้นกว่าและเป็นส่วนหนึ่งของ “apples”)
- “Apple” < “apple” (เพราะตัวพิมพ์ใหญ่มาก่อนตัวพิมพ์เล็ก)
- “zebra” > “ant” (เพราะ ‘z’ มาหลัง ‘a’ ในพจนานุกรม)
การใช้งานในโปรแกรม Java
ในภาษา Java เราใช้เมธอด compareTo() หรือ compareToIgnoreCase() เพื่อเปรียบเทียบสตริงแบบ lexicographical:
String str1 = "apple";
String str2 = "banana";
int result = str1.compareTo(str2);
// result จะเป็นค่าลบ เพราะ "apple" มาก่อน "banana"
if (result < 0) {
System.out.println("str1 มาก่อน str2");
} else if (result > 0) {
System.out.println("str1 มาหลัง str2");
} else {
System.out.println("str1 เท่ากับ str2");
}Unicode กับการเปรียบเทียบสตริงใน Java
- การเรียงลำดับตาม Unicode:
- Java ใช้ค่า Unicode ในการเปรียบเทียบตัวอักษร
- ตัวอักษรที่มีค่า Unicode น้อยกว่าจะมาก่อน
- ผลกระทบต่อภาษาต่างๆ:
- ตัวอักษรละตินมาก่อนตัวอักษรไทยในการเรียงลำดับ
- ตัวอย่าง: “a” < “ก” (เพราะ ‘a’ มีค่า Unicode น้อยกว่า ‘ก’)
- การจัดการกับตัวอักษรพิเศษ:
- สัญลักษณ์และเครื่องหมายวรรคตอนมักมาก่อนตัวอักษรและตัวเลข
- ตัวอย่าง: ”!” < “A” < “a” < “1”
| Characters | Unicode Values |
|---|---|
| 0 - 9 | 48 ถึง 57 |
| A - Z | 65 ถึง 90 |
| a - z | 97 ถึง 122 |
ตัวอย่างการเปรียบเทียบที่เกี่ยวข้องกับ Unicode:
String thai1 = "สวัสดี";
String thai2 = "สบายดี";
String english1 = "Hello";
String english2 = "hello";
System.out.println(thai1.compareTo(thai2)); // ค่าเป็นบวก เพราะ 'ว' มาหลัง 'บ'
System.out.println(english1.compareTo(thai1)); // ค่าเป็นลบ เพราะ 'H' มาก่อน 'ส'
System.out.println(english1.compareTo(english2)); // ค่าเป็นลบ เพราะ 'H' มาก่อน 'h'