บทความทั้งหมด

การเรียงบรรทัด: ทำไมการเรียงตามตัวอักษรถึงต่างจากการเรียงตามตัวเลข

ในภาษาไทย สระบนและวรรณยุกต์ที่เกาะอยู่เหนือหรือใต้พยัญชนะ (เช่น ่ ้ ๊ ๋ ั ี ึ) เป็นอักขระ Unicode แยกต่างหากที่ต่อท้ายพยัญชนะฐาน แต่มาตรฐานไม่ได้บังคับลำดับที่แน่นอนเมื่อมีเครื่องหมายซ้อนกันหลายตัว ผลคือสองบรรทัดที่หน้าตาเหมือนกันทุกประการบนหน้าจออาจถูกพิมพ์หรือบันทึกด้วยลำดับอักขระข้างในต่างกัน ทำให้เครื่องมือลบรายการซ้ำมองว่าเป็นคนละบรรทัด ทั้งที่สายตาคนมองว่าเหมือนกัน

การเรียงตามตัวอักษรกับตามตัวเลข

การเรียงตามตัวอักษร (lexicographic) เปรียบเทียบสตริงทีละตัวอักษรเหมือนข้อความ ด้วยเหตุนี้ สตริง "10" จึงมาก่อน "9" เพราะตัวอักษร "1" มีค่าน้อยกว่า "9" ในทาง lexicographic — การเรียงลำดับไม่ "เข้าใจ" ว่านี่คือตัวเลข ในทางกลับกัน การเรียงตามตัวเลขจะแปลงสตริงเป็นตัวเลขก่อนเปรียบเทียบ ทำให้ได้ลำดับที่คาดหวังคือ 9, 10, 11

การสนใจตัวพิมพ์ใหญ่เล็กเมื่อเรียงลำดับ

ในระบบส่วนใหญ่ ตัวพิมพ์ใหญ่จะมาก่อนตัวพิมพ์เล็กในทาง lexicographic (เพราะการเข้ารหัสอักขระ) ดังนั้น "Zebra" อาจมาก่อน "apple" ในการเรียงแบบสนใจตัวพิมพ์ใหญ่เล็ก การเรียงแบบไม่สนใจตัวพิมพ์ใหญ่เล็กจะปรับสตริงให้เป็นตัวพิมพ์เดียวกันก่อนเปรียบเทียบ ในขณะที่ยังคงตัวพิมพ์เดิมไว้ในผลลัพธ์

การลบรายการซ้ำ

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

ทำไมต้องใช้สิ่งนี้

  • ลบรายการอีเมลหรือ URL ที่ซ้ำกันก่อนนำเข้าข้อมูล
  • เรียงรายการเวอร์ชันหรือ ID ตามตัวเลขแทนที่จะเป็นข้อความ
  • เปรียบเทียบชุดข้อมูลสองชุดอย่างรวดเร็วโดยแปลงทั้งสองรายการให้อยู่ในรูปแบบที่เรียงแล้วเหมือนกัน

การเรียงลำดับแบบธรรมชาติ (natural sort)

การเรียงลำดับแบบธรรมชาติเป็นทางเลือกกึ่งกลางระหว่างการเรียงตามตัวอักษรและตามตัวเลข: มันรู้จักลำดับตัวเลขภายในบรรทัดว่าเป็นตัวเลขจริง ๆ ส่วนอักขระที่เหลือจะเปรียบเทียบแบบข้อความตามปกติ ด้วยวิธีนี้ file2.txt จะอยู่ก่อน file10.txt แม้ในทางเทคนิคทั้งสองจะเป็นสตริง ไม่ใช่ตัวเลขโดด ๆ — มีประโยชน์กับชื่อไฟล์หรือเวอร์ชันที่มีคำนำหน้าเป็นข้อความ

ลองใช้เครื่องมือ