Skip to Content
CoursesCSC102โปรแกรมปรียบเทียบสตริง

โปรแกรมเปรียบเทียบสตริงภาษา Java

โจทย์

คุณวงศ์ เป็นนักพัฒนาซอฟต์แวร์ที่กำลังทำงานในโครงการที่เกี่ยวข้องกับการประมวลผลข้อมูลที่ป้อนโดยผู้ใช้ เขาต้องการโปรแกรมที่สามารถเปรียบเทียบสตริงสองตัวและดำเนินการต่างๆ ตามผลลัพธ์ของการเปรียบเทียบ โดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก คุณวงศ์ได้ขอความช่วยเหลือจากคุณในการเขียนโปรแกรมนี้

ข้อกำหนด

  1. เปรียบเทียบสตริงสองตัวเพื่อตรวจสอบว่าเท่ากันหรือไม่ โดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก
  2. ถ้าสตริงเท่ากัน ให้แสดง “The strings are equal.”
  3. ถ้าสตริงไม่เท่ากัน ให้แสดง “The strings are not equal.” และเปรียบเทียบความยาวของสตริงต่อ:
  • ถ้าสตริงแรกยาวกว่า ให้แสดง “The first string is longer.”
  • ถ้าสตริงที่สองยาวกว่า ให้แสดง “The second string is longer.”
  • ถ้าสตริงทั้งสองมีความยาวเท่ากันแต่เนื้อหาต่างกัน ให้แสดง “The strings have the same length but different content.”
  1. นอกจากนี้ ให้ทำการเปรียบเทียบแบบ lexicographical โดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก:
  • ถ้าสตริงแรกมาก่อนสตริงที่สองในการเรียงลำดับ lexicographical ให้แสดง “The first string comes before the second string lexicographically.”
  • ถ้าสตริงแรกมาหลังสตริงที่สองในการเรียงลำดับ lexicographical ให้แสดง “The first string comes after the second string lexicographically.”
InputResult
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.

โค้ด

Main.java
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."); } } } }

คำอธิบาย

  1. เริ่มต้นด้วยการนำเข้าคลาส Scanner เพื่อรับข้อมูลจากผู้ใช้

  2. สร้างออบเจกต์ Scanner เพื่อรับข้อมูลจาก System.in

  3. รับข้อความสองบรรทัดจากผู้ใช้และเก็บไว้ในตัวแปร firstText และ secondText

  4. ใช้เมธอด equalsIgnoreCase() เพื่อเปรียบเทียบสตริงทั้งสองโดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก

  • ถ้าเท่ากัน แสดง “The strings are equal.”
  • ถ้าไม่เท่ากัน ดำเนินการต่อไปนี้:
  1. แสดง “The strings are not equal.”

  2. เปรียบเทียบความยาวของสตริงทั้งสอง:

  • ถ้า firstText ยาวกว่า แสดง “The first string is longer.”
  • ถ้า secondText ยาวกว่า แสดง “The second string is longer.”
  • ถ้ายาวเท่ากัน แสดง “The strings have the same length but different content.”
  1. ใช้เมธอด compareToIgnoreCase() เพื่อเปรียบเทียบสตริงแบบ lexicographical โดยไม่คำนึงถึงตัวพิมพ์ใหญ่หรือเล็ก:
  • ถ้าผลลัพธ์มากกว่า 0 แสดงว่า firstText มาหลัง secondText ในการเรียงลำดับ
  • ถ้าผลลัพธ์น้อยกว่า 0 แสดงว่า firstText มาก่อน secondText ในการเรียงลำดับ

การเปรียบเทียบแบบ Lexicographical คืออะไร

การเปรียบเทียบแบบ lexicographical หรือ lexicographic order เป็นวิธีการเรียงลำดับคำหรือสตริงที่คล้ายกับการเรียงคำในพจนานุกรม ซึ่งเป็นแนวคิดสำคัญในการเขียนโปรแกรมและการจัดการข้อมูล

คำอธิบาย

  1. เปรียบเสมือนการเรียงคำในพจนานุกรม:
  • ลองนึกถึงวิธีที่คำถูกเรียงในพจนานุกรม คำว่า “apple” จะมาก่อน “banana” เสมอ
  1. เปรียบเทียบทีละตัวอักษร:
  • เริ่มจากตัวอักษรแรกของแต่ละคำ
  • ถ้าตัวอักษรเหมือนกัน ให้เปรียบเทียบตัวถัดไป
  • ทำแบบนี้ไปเรื่อยๆ จนกว่าจะพบตัวอักษรที่ต่างกัน
  1. ตัวอักษรที่มาก่อนในพจนานุกรมถือว่า “น้อยกว่า”:
  • ‘a’ < ‘b’ < ‘c’ < … < ‘z’
  • ตัวพิมพ์ใหญ่จะมาก่อนตัวพิมพ์เล็กเสมอ: ‘A’ < ‘a’
  1. ความยาวมีผล:
  • ถ้าสตริงหนึ่งเป็นส่วนหนึ่งของอีกสตริงหนึ่ง สตริงที่สั้นกว่าจะมาก่อน
  • เช่น “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

  1. การเรียงลำดับตาม Unicode:
  • Java ใช้ค่า Unicode ในการเปรียบเทียบตัวอักษร
  • ตัวอักษรที่มีค่า Unicode น้อยกว่าจะมาก่อน
  1. ผลกระทบต่อภาษาต่างๆ:
  • ตัวอักษรละตินมาก่อนตัวอักษรไทยในการเรียงลำดับ
  • ตัวอย่าง: “a” < “ก” (เพราะ ‘a’ มีค่า Unicode น้อยกว่า ‘ก’)
  1. การจัดการกับตัวอักษรพิเศษ:
  • สัญลักษณ์และเครื่องหมายวรรคตอนมักมาก่อนตัวอักษรและตัวเลข
  • ตัวอย่าง: ”!” < “A” < “a” < “1”
CharactersUnicode Values
0 - 948 ถึง 57
A - Z65 ถึง 90
a - z97 ถึง 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'
ปรับปรุงล่าสุด