By Arnon Puitrakul - 25 ธันวาคม 2014
เมื่อวานเราได้เรียนเรื่องของอะไรว่ะ ลืม... เดียวนะอ่อ Array กับ ArrayList ไปแล้ว วันนี้มาเปลี่ยนอารมณ์กันบ้าง (ตรงไหนว่ะ!!) วันนี้เราจะมาเรียนรู้ในเรื่องของ String กัน
String หรือในภาษาไทยอันสวยเก๊ว่า "สายอัขระ" สวยป่ะล่ะ สรุปสั้นเลยว่า String มันก็คือชุดของตัวอักษรนั้นแหละ แต่มันจะต่างจากภาษา C อยู่ จากในภาษา C String มันคือ Array ของ Char แต่ใน Java เราพัฒนาแล้วจร้า มันถูกบัญญัติลงไปเป็น Datatype แบบนึงเลยล่ะแกร์!! เจ๋งเวอร์!! ถามว่า แล้วเราจะประกาศมันยังไงล่ะ? ไม่ยาก
ถ้าเราจำเรื่องของการสร้าง Object ได้ (String 1 อันเราจะมองว่ามันเป็น Object ชิ้นหนึ่งเหมือนกัน)
String a = new String();
ก็ได้ หรือ เอาที่ง่ายกว่านั้นคือ
String a;
จบง่ายมั้ยล่าาา
การให้ค่ามันก็ไม่ยุ่งยากเหมือนใน C เพียงแค่บอกว่า (สมมุติผมประกาศ String a; ไปแล้วนะ)
a = “Hello World”;
ได้เลย ก็ยังไม่ยากอยู่ดี ทีนี้เมื่อตอนแรกผมบอกว่า String มันก็คือ Object ตัวนึงใช่ม่ะ
แปลว่ามันจะต้องมี Method ด้วยเหมือนกัน เรามาดู Method กันดีกว่า
ถามว่าแล้วเราจะสร้างมันขึ้นมาได้ยังไง
ก่อนหน้านั้น ขอให้มองมัน 2 ตัวนี้เป็น Class ตัวนึงก่อน เหมือนเดิม การสร้าง Object จาก Class
ในที่นี้ผมจะยกตัวอย่างแค่ StringBuffer พอนะ เพราะว่าการใช้มันเหมือนกันเลย (ส่วนความแตกต่างเดียวจะมาอธิบายข้างล่างนะ)
มาสร้างกันเลย สมมุติว่าผมจะสร้าง StringBuffer ชื่อ sb มาตัวนึง
StringBuffer sb = new StringBuffer();
[/code]
**Warning เราไม่สามารถ sb = “Hello”; ไม่ได้นะ มันจะ Error**
แค่นี้เองเราก็จะได้ StringBuffer ตัวนึงมาใช้แล้ว ทีนี้เรามาดู Method ของมันบ้าง
append() - อันนี้เราจะส่ง String แล้วเอาไปต่อข้างหลังสุด เช่น sb.append(“Hello World”); เพราะฉะนั้น StringBuffer ของเราจะมีคำว่า Hello World อยู่ด้านหลังสุด
insert() - คล้ายๆ append เมื่อกี้เลย แต่ append มันเอาไปต่อที่หลังสุด insert ก็เอาไปต่อเหมือนกัน แต่เราระบุตำแหน่งเองได้ เช่น sb.insert(0,”HI!!”); จากเมื่อกี้เรามีคำว่า Hello World อยู่แล้ว ถ้าเราอัก insert เมื่อกี้เข้าไปมันก็จะเป็น HI!!Hello World
delete() - ตามชื่อเลยคือการลบออก เช่น sb.delete(0,3); นั่นคือการ delete char ตั้งแต่ตำแหน่ง 0 ถึง 3 นั่นคือคำว่า HI!! เพราะฉะนั้น sb จะเหลือแค่คำว่า Hello World เหมือนเดิม
length() - ก็ตามชื่ออีกตามเคย เราจะได้จำนวนตัวอักษรของมันกลับมา เช่น sb.length(); ใน sb เรามี Hello World เพราะฉะนั้นค่าที่เราจะได้จาก Method length ก็คือ 11 นั่นเอง (รวม space ด้วยนะ)
อย่างที่ผมบอกไว้ตอนข้างบนว่า เดียวจะมาอธิบายความแตกต่างของ StringBuilder กับ StringBuffer
จริงๆแล้วมันทั้ง 2 นั้นต่างกันเพียงเล็กน้อยเท่านั้น
ต่างกันในเรื่องของ Thread S****ynchronization ซึ่งผมว่ามันลึกไปในระดับเบื้องต้นจึงไม่ขอพูดถึงในที่นี้
เอาง่ายๆถ้าอยาก Play Safe ให้ใช้ StringBuffer
แต่ถ้าอยากไวใน String ใหญ่ๆยาวๆ (รู้นะคิดอะไรกัน) ให้ใช้ StringBuilder
จบแล้ว สำหรับเรื่อง String ตอนนี้น่าจะมาได้สักครึ่งทางของ Java 101 แล้ว สู้ๆๆ
Source Code
**String : ** https://drive.google.com/folderview?id=0BwrPA9Miv4o2RUFsbzVNT1Q3YXc&usp=sharing
** StringBuilder & StringBuffer : ** https://drive.google.com/folderview?id=0BwrPA9Miv4o2RlB0YUFCcUN0b0k&usp=sharing
เวลาเราทำงานกับข้อมูลอย่าง Pandas DataFrame หนึ่งในงานที่เราเขียนลงไปให้มันทำคือ การ Apply Function เข้าไป ถ้าข้อมูลมีขนาดเล็ก มันไม่มีปัญหาเท่าไหร่ แต่ถ้าข้อมูลของเราใหญ่ มันอีกเรื่องเลย ถ้าเราจะเขียนให้เร็วที่สุด เราจะทำได้โดยวิธีใดบ้าง วันนี้เรามาดูกัน...
Python เป็นภาษาที่เราใช้งานกันเยอะมาก ๆ เพราะความยืดหยุ่นของมัน แต่ปัญหาของมันก็เกิดจากข้อดีของมันนี่แหละ ทำให้เมื่อเราต้องการ Performance แต่ถ้าเราจะบอกว่า เราสามารถทำได้ดีทั้งคู่เลยละ จะเป็นยังไง เราขอแนะนำ Numba ที่ใช้งาน JIT บอกเลยว่า เร็วขึ้นแบบ 700 เท่าตอนที่ทดลองกันเลย...
หลายวันก่อน เราทำงานแล้วเราต้องการทำงานกับตัวเลขเพื่อให้มันอ่านได้ง่ายขึ้น จะมานั่งเขียนเองก็เสียเวลา เลยไปนั่งหา Library มาใช้ จนไปเจอ Humanize วันนี้เลยจะเอามาเล่าให้อ่านกันว่า มันทำอะไรได้ แล้วมันล่นเวลาการทำงานของเราได้ยังไง...
การทำงานกับตัวเลขทศนิยมบนคอมพิวเตอร์มันมีความลับซ่อนอยู่ เราอาจจะเคยเจอเคสที่ เอา 0.3 + 0.6 แล้วมันได้ 0.899 ซ้ำไปเรื่อย ๆ ไม่ได้ 0.9 เพราะคอมพิวเตอร์ไม่ได้มองระบบทศนิยมเหมือนกับคนนั่นเอง บางตัวมันไม่สามารถเก็บได้ เลยจำเป็นจะต้องประมาณเอา เราเลยเรียกว่า Floating Point Approximation...