CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
บทที่ 7 การประมวลผลขอมูล String 7.1 การประกาศขอมูล String เปน class ใน java.lang.String ซึง่ ถูกนําเขามาในโปรแกรมโดยอัตโนมัติ ดังนั้นจึงไมจําเปน ตองใชคําสั่ง import เพื่อนํา class เขาสูการประมวลผล ก็สามารถเรียกใชได class String ไดเตรียม constructors ( constructors เปน method ทีใ่ ชสาหรั ํ บการกําหนดคาเริ่มตน ใหกับ object ของ class ) ไวทงั้ หมด 9 แบบ ตัวอยางที่ 1 เปนตัวอยางการใช class String โดยผาน constructors จํานวน 7 แบบดวยกัน ตัวอยางที่ 1 1 public class StringConstructors { 2 3 public static void main (String args[]) { 4 char charArray[] = { ‘b’, ‘i’, ‘r’, ‘t’, ‘h’, ‘ ‘, ‘d’, ‘a’, ‘y’ }; 5 byte byteArray[] = { (byte) ’n’, (byte) ‘e’, (byte) ‘w’, (byte) ‘ ‘, (byte) ‘y’, 6 (byte) ‘e’, (byte) ‘a’, (byte) ‘r’ }; 7 StringBuffer buffer; 8 String s, s1, s2, s3, s4, s5, s6, s7, output; 9 10 s = new String( “hello” ); 11 buffer = new StringBuffer( “Welcome to Java Programming” ); 12 13 s1 = new String(); 14 s2 = new String( s ); 15 s3 = new String( charArray ); 16 s4 = new String( charArray, 6, 3 ); 17 s5 = new String( byteArray, 4, 4 ); 18 s6 = new String( byteArray ); 19 s7 = new String( buffer ); 20 21 output = “s1 = “ + s1 + 22 “\ns2 = “ + s2 + 23 “\ns3 = “ + s3 + 24 “\ns4 = “ + s4 + 25 “\ns5 = “ + s5 + 26 “\ns6 = “ + s6 + 27 “\ns7 = “ + s7; 28 System.out.println(output); 29 30 } // end method main 31 32 } // end class StringConstructors
การเรียกใช method ตางๆ ของ class String จําเปนตองมีการสราง object ขึน้ มากอน ดังแสดงใน บรรทัดที่ 7,8,10 และ 11 หลักการการประกาศ object จะเหมือนกับการประกาศ object ของ class อื่นๆ
2/2545
1
CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
Constructor ทั้ง 7 แบบ แสดงในบรรทัดที่ 13 – 19 ดังมีรายละเอียด ดังนี้ บรรทัดที่ 13 คาเริ่มตนของ s1 จะไมมกี ารเก็บอักขระใดๆ ความยาวจะเทากับ 0 บรรทัดที่ 14 เปนการ copy ขอความของ s ใหกับ s2 บรรทัดที่ 15 constructor นีจ้ ะเปนการรับคาของตัวแปรชุดของ character และกําหนดเปนคาเริ่มตน ใหกับ s3 บรรทัดที่ 16 constructor นีเ้ ปนการกําหนดคาของสมาชิกบางตัวของตัวแปรชุดของ character โดย ตัวเลขตัวแรก เปนตําแหนงเริ่มตนของตัวอักขระที่ตองการ ตัวเลขตัวที่สอง เปนจํานวนสมาชิกนับจากตําแหนง เริม่ ตน ที่ตองการกําหนดใหกับ object ของ class String บรรทัดที่ 17 การทํางานของ constructor นีจ้ ะคลายกับบรรทัดที่ 16 เพียงแตชนิดขอมูลจะเปนแบบ byte การกําหนดตัวเลขดังแสดงในบรรทัดที่ 16 และ 17 หากตัวเลขลําดับ หรือจํานวนตัวอักขระ เกินขอบเขต ของตัวแปรชุด โปรแกรมจะจัดวามี error เกิดขึน้ ซึ่งจะมีการเรียก StringIndexOutOfBoundsException เพื่อ บอกใหผูใชทราบถึงขอผิดพลาดที่เกิดขึ้น บรรทัดที่ 18 เปนการรับคาของตัวแปรชุดของ byte ทัง้ ชุด และกําหนดเปนคาเริ่มตนใหกับ s6 บรรทัดที่ 19 เปนการกําหนดคาเริ่มตนใหกับ s7 โดยรับมาจาก object ของ class StringBuffer ซึ่ง เปน class ทีม่ ขี นาดไมตายตัว แตจะขึ้นอยูกับจํานวนอักขระใน string นั้นๆ 7.2 String Methods: length, charAt and getChars ตัวอยางที่ 2 public class StringMisc { public static void main ( String args[] ) { String s1, output; char charArray[]; s1 = new String( “hello there” ); charArray = new char [5]; // output the string output = “s1: “ + s1; // test the length method output += “\nLength of s1: “ + s1.length(); // loop through the characters in s1 and display reversed output += “\nThe string reversed is: “; for ( int j = s1.length() –1; j>=0; j--) output += s1.charAt(j) + “ “; // copy characters from string into char array s1.getChars(0, 5, charArray, 0 ); output += “\nThe character array is: “; for ( int j=0; j
2/2545
2
CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
length() เปน method ที่ return คาจํานวนอักขระใน string นั้นๆ method นีใ้ น class String จะมี การเรียกใชงานที่ตางกับ length ของ arrays กลาวคือ length ใน class String ตองมีเครื่องหมาย () ปดทายทุก ครั้ง สวนของ arrays นั้นไมตองมี charAt() เปน method ที่ return ตัวอักขระในตําแหนงที่ระบุ อักขระตัวแรกของ string จะเปนลําดับที่ 0 ซึง่ เหมือนกับการอางอิงสมาชิกในตัวแปรชุด getChars() เปนการ copy sub-string ไปเก็บไวที่ตัวแปรชุด ชนิด character ตัวเลขตัวแรกคือ ตําแหนงของอักขระที่จะเริ่มตน copy ตัวเลขตัวทีส่ อง เปนตําแหนงถัดจากตําแหนงสุดทายของตัวอักขระที่ ตองการ copy parameter ตัวที่ 3 เปนชื่อตัวแปรชุดที่จะเก็บขอมูลที่ copy สวนตัวเลขตัวสุดทายเปน ตําแหนงเริ่มตนของตัวแปรชุดที่จะนําชุดอักขระไปเก็บไว 7.3 การเปรียบเทียบขอมูล String มีการเปรียบเทียบ 4 ลักษณะ ดังนี้ 1. String1.equals(String2) 2. String1.equalsIgnoreCase(String2) เปนตัวพิมพใหญ หรือตัวพิมพเล็ก 3. String1.compareTo(String2) นอยกวา หรือเทากัน 4. String1.substring(start, pastEnd)
// เปรียบเทียบขอความระหวาง String1 กับ String2 // เปรียบเทียบขอความโดยไมคํานึงถึงวาอักษรนั้น // เปรียบเทียบขอความใหผลในลักษณะมากกวา // ตัดขอความตั้งแตตําแหนง start ถึง pastEnd
ตัวอยางที่ 3 class SortArray { public static void main ( String args[] ) { String text[] = { “Java”, “Computer”, “Memory”, "String”, “Book”, “Array”, “Object”, “Polymorphism”, “Inheritance” }; int tmp; String tmpString; for (int j=0; j 0) tmp = k; tmpString = text[j]; text[j] = text[tmp]; text[tmp] = tmpString; } for (int m=0; m
2/2545
3
CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
String1.equals(String2) ในการเปรียบเทียบขอมูลประเภท String ไมสามารถใชตัวกระทํา ‘==’ ในการทดสอบได เนื่องจาก String เปน class ตัวแปรทีต่ ั้งขึ้นเปนการเก็บที่อยูของขอมูล ไมไดเก็บตัวขอมูล method equals นี้ จะทําการเปรียบเทียบ String1 และ String2 วาเหมือนกันหรือไม ซึ่งจะเปนการ เปรียบเทียบแบบ case sensitive กลาวคือ ตัวอักษรพิมพใหญ กับตัวอักษรพิมพเล็กจะถือวาเปนคนละตัวกัน String1.equalsIgnoreCase(String2) มีการทํางานเหมือนกับ method equals แตจดุ ที่แตกตางคือ ในกรณีนี้ตัวอักษรพิมพใหญ กับตัว อักษรพิมพเล็กจะถือวาเปนตัวเดียวกัน String1.compareTo(String2) เปนการเปรียบเทียบขอมูล String1 กับ String2 โดยจะเปรียบเทียบทีละตัวอักษร และผลการเปรียบ เทียบจะคืนคาเปนจํานวนเต็ม ดังนี้ ถา String1 เหมือนกับ String2 จะคืนคา 0 ถา String1 มีรหัส ASCII นอยกวา String2 จะคืนคา ติดลบ ถา String1 มีรหัส ASCII มากกวา String2 จะคืนคา เปนบวก String1.substring(start, end) เปนการดึงบางสวนของ string (sub-string) เชน String aName = “Java Programming”; String subStr = new String( aName.substring( 0, 3) ); subStr จะมีคาตัวอักษร 3 ตัวแรกของ aName คือ Jav 7.4 Method อืน่ ๆ ของ class String ตัวอยางที่ 4 public class StringMisc2 { public static void main( String args[] ) { String s1 = new String( “hello” ), s2 = new String( “GOOD BYE” ), s3 = new String( “ spaces “), output; output = “s1 = “ + s1 + “\ns2 = “ + s2 + “\ns3 = “ + s3; // test method replace output += “ \n\nReplace ‘l’ with ‘L’ in s1: “ + s1.replace(‘l’, ‘L’); // test toLowerCase and toUpperCase output += “\n\ns1.toUpperCase() = “ + s1.toUpperCase() + “\ns2.toLowerCase() = “ + s2.toLowerCase();
2/2545
4
CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
ตัวอยางที่ 4 (ตอ) // test trim method output += “\n\ns3 after trim = \” “ + s3.trim() + “\””; // test toString method output += “\n\ns1 = “ + s1.toString(); // test toCharArray method char charArray[] = s1.toCharArray(); output += “\n\ns1 as a character array = “; for ( int j=0; j
7.5 StringBuffer การเปลี่ยนแปลงคาของ String ทุกครัง้ จะเปนการจองเนื้อที่ใหมใหทุกครั้ง หรือกลาวอีกนัยหนึ่งคือ เปน class ทีอ่ นุญาตใหอานไดอยางเดียว จะไมมีการแกไขขอมูลในตัวแปรประเภท String StringBuffer จะเปนการแกปญหาโดยไมตองจองเนื้อที่ใหมทุกครั้ง นัน่ คือ อนุญาตใหมีการแกไขตัว ขอมูลได โดย class StringBuffer นี้มี constructor 3 รูปแบบ คือ public StringBuffer() // เตรียมเนื้อที่สําหรับขอมูล โดยปกติจะเตรียมใหประมาณ 16 ตัวอักษร public StringBuffer(int length) // กําหนดขนาดที่ตองการ แตยังไมมีขอมูลที่จะเก็บ public StringBuffer(String S) // เก็บขอมูลตามที่กําหนด ขนาดจะเทากับขนาดที่กําหนด บวกอีก 16 ตัวอักษร ทุกๆ StringBuffer จะมีขนาดจํากัด แตเมื่อมีการเพิ่มจํานวนตัวอักษร Java จะเพิ่มขนาดใหโดย อัตโนมัติ method ของ StringBuffer ประกอบดวย - length // จะ return จํานวนอักขระที่อยูใน StringBuffer - capacity // จะ return จํานวนอักขระที่สามารถเก็บไวที่ StringBuffer ได - setLength // เปนการกําหนดจํานวนอักขระที่อยูใน StringBuffer - ensureCapacity // เปนการกําหนดขนาดความจุตํ่าสุดที่ StringBuffer นัน้ จะ เก็บอักขระได - charAt // จะ return อักขระที่อยูในตําแหนงที่ระบุใน method charAt 2/2545
5
CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
- setCharAt
-
// method นี้จะมี argument 2 ตัวคือ ตัวเลขที่ระบุตําแหนง ของอักขระ และตัวอักขระ โดย method นีจ้ ะเปลี่ยนอักขระ ทีอ่ ยูในตําแหนงที่ระบุใน method นี้ ใหเปนอักขระที่ระบุ เปน argument ใน method นี้นั่นเอง getChars // จะ return คา array ชนิด character ทีม่ คี วามยาว และขอ มูลเหมือนกับที่อยูใน StringBuffer นั้นๆ reverse // จะเปนการเปลี่ยนลําดับการเรียงอักขระใน StringBuffer String1.append(String2) // นําขอมูลใน String2 ตอทาย String1 String2.insert(position, String2) // แทรก String2 ตามตําแหนงที่กําหนดในสวนของ position ที่ String1 อักษรตัวแรกของ String จะเริ่มจาก 0 delete และ deleteCharAt // เปนการลบอักขระที่อยูใน StringBuffer
ตัวอยางที่ 5 : เปนตัวอยางการใชงาน method length, capacity, setLength และ ensureCapacity import javax.swing.*; public class StringBufferCapLen { public static void main( String args[] ) { StringBuffer buf = new StringBuffer( "Hello, how are you?" ); String output = "buf = " + buf.toString() + "\nlength = " + buf.length() + "\ncapacity = " + buf.capacity(); buf.ensureCapacity( 75 ); output += "\n\nNew capacity = " + buf.capacity(); buf.setLength( 10 ); output += "\n\nNew length = " + buf.length() + "\nbuf = " + buf.toString(); JOptionPane.showMessageDialog( null, output, "StringBuffer length and capacity Methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } }
2/2545
6
CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
ตัวอยางที่ 6 : เปนตัวอยางการใชงาน method charAt, setCharAt, getChars และ reverse import javax.swing.*; public class StringBufferChars { public static void main( String args[] ) { StringBuffer buf = new StringBuffer( "hello there" ); String output = "buf = " + buf.toString() + "\nCharacter at 0: " + buf.charAt( 0 ) + "\nCharacter at 4: " + buf.charAt( 4 ); char charArray[] = new char[ buf.length() ]; buf.getChars( 0, buf.length(), charArray, 0 ); output += "\n\nThe characters are: "; for ( int i = 0; i < charArray.length; ++i ) output += charArray[ i ]; buf.setCharAt( 0, 'H' ); buf.setCharAt( 6, 'T' ); output += "\n\nbuf = " + buf.toString(); buf.reverse(); output += "\n\nbuf = " + buf.toString(); JOptionPane.showMessageDialog( null, output, "Demonstrating StringBuffer Character Methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } }
ตัวอยางที่ 7 : เปนตัวอยางที่ใชงาน method append import javax.swing.*; public class StringBufferAppend { public static void main( String args[] ) { Object o = "hello"; String s = "good bye"; char charArray[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; boolean b = true; char c = 'Z'; int i = 7; long l = 10000000; float f = 2.5f; double d = 33.333; StringBuffer buf = new StringBuffer();
2/2545
7
CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
ตัวอยางที่ 7 (ตอ) buf.append( o ); buf.append( " " ); buf.append( s ); buf.append( " " ); buf.append( charArray ); buf.append( " " ); buf.append( charArray, 0, 3 ); buf.append( " " ); buf.append( b ); buf.append( " " ); buf.append( c ); buf.append( " " ); buf.append( i ); buf.append( " " ); buf.append( l ); buf.append( " " ); buf.append( f ); buf.append( " " ); buf.append( d ); JOptionPane.showMessageDialog( null, "buf = " + buf.toString(), "Demonstrating StringBuffer append Methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } }
ตัวอยางที่ 8 : เปนตัวอยางการใชงาน method insert delete และ deleteCharAt import javax.swing.*; public class StringBufferInsert { public static void main( String args[] ) { Object o = "hello"; String s = "good bye"; char charArray[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; boolean b = true; char c = 'K'; int i = 7; long l = 10000000; float f = 2.5f; double d = 33.333; StringBuffer buf = new StringBuffer(); buf.insert( 0, o ); buf.insert( 0, " " ); buf.insert( 0, s ); buf.insert( 0, " " ); buf.insert( 0, charArray );
2/2545
8
CS313: Object-Oriented Programming
บทที่ 7: การประมวลผลขอมูล String
ตัวอยางที่ 8 (ตอ) buf.insert( 0, " " ); buf.insert( 0, b ); buf.insert( 0, " " ); buf.insert( 0, c ); buf.insert( 0, " " ); buf.insert( 0, i ); buf.insert( 0, " " ); buf.insert( 0, l ); buf.insert( 0, " " ); buf.insert( 0, f ); buf.insert( 0, " " ); buf.insert( 0, d ); String output = "buf after inserts:\n" + buf.toString(); buf.deleteCharAt( 10 ); // delete 5 in 2.5 buf.delete( 2, 6 ); // delete .333 in 33.333 output += "\n\nbuf after deletes:\n" + buf.toString(); JOptionPane.showMessageDialog( null, output, "Demonstrating StringBufferer Inserts and Deletes", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } }
ขอควรระวังในการใช method ทีเ่ กีย่ วของกับการอางอิงตําแหนงของอักขระใน StringBuffer เชน charAt deleteCharAt ฯลฯ คือคาตัวเลขที่อางอิงตําแหนงนั้นจะตองมีคามากกวาหรือเทากับ 0 และนอยกวา คาความยาวของอักขระใน StringBuffer
2/2545
9