Lec05_1 :: สายอกัขระ String , String Builder and String Buffer
การเขยีนโปรแกรมจาวา (4121309)
โดย อ. นัฐพงศ ์ สง่เนยีม
http://www.siam2dev.net
Reviews
Variable
Identifier ชือ่
Scope ระดบัของตวัแปร
Data Type
Casting
Control Statement ค าสัง่ควบคมุการท างาน
Decision
Loop
Variables : ตวัแปร• การประกาศตวัแปร
– Type Var-name; ตวัอย่าง int x;
– Type Var-name; ตวัอย่าง int x = 10;
– Type Var-name; ตวัอย่าง float pi =3.14f;
• การก าหนดคา่ (assign value = )
– X = 80;
– Name = “Dr. Nattapong Songneam”;
– ch=‘A’; // char ’..’
• ระดบัการใช้งาน
• ชนิดข้อมลู
• การแปลงชนิด (Casting)
– Implicit แปลงโดยปริยาย โดยจาวา
– Explicit
Test_Var
• D:\Java_Prog
โครงสร้าง code ท่ีไม่มี comment
ช่ือคลาส
ช่ือแพก็เกจ
ส่วนโปรแกรมหลกั
วงเลบ็ปิดของคลาส
การประกาศตวัแปรในบริเวณใด (Scope)
• Global
• Local
– Class
– Method
– Block
ตัวแปร y เป็นระดบัโกลบอล global
ตัวแปร x เป็นระดบัโลคอล local
Test_Var
y : int
+ Main()
x:int
ตัวแปร x เป็นระดบัโลคอล local
ตัวแปร x เป็นระดบัโลคอล local
ก. 8ข. 10ค. 12ง. 13จ. ไม่มีขอ้ใดถูก
ประเภทขอ้ผิดพลาด
• Syntax Error
• Runtime Error
• Logical Error
Syntax Error / Logical Error
• ใน main จะยงัไม่สามารถเรยีกใชง้าน add() ถา้ยงัไม่ก าหนดใหเ้ป็น static
• ดงันัน้ เมธอดทีจ่ะสามารถเรยีกใชง้านใน main ไดเ้ฉพาะ static method เทา่นัน้
• ดงันัน้ท าให ้add เป็น static กอ่น
ตวัแปร i เป็นตวัแปรระดบั Block
Test_Var
y : int
+ Main()
x:int
String , StringBuilder และ StringBuffer
• ชนิดข้อมูลพื้นฐานที่เป็นตัวอักษร char สารมารถน าเสนอตัวอักษรได้เพียงตัวเดียว ซึ่งไม่เพียงพอต่อการน าไปใช้งานทั่วไปได้ โปรแกรมส่วนใหญ่จึงต้องการน าเสนอข้อมูลที่เป็นค าหรือประโยค ก็คือสามารถน าตัวอักษรมาเรียงต่อกันเป็นสาย คล้ายกับสายอักษร แต่ นอกจากเก็บตัวอักษรได้แล้ว ยังสามารถเก็บตัวเลข และสัญลักษณ์อื่นได้ อีกด้วย จึงเรียกรวมกันว่าสายอักขระ ภาษาจาวามีชนิดข้อมูลที่เป็นสายอักขระได้ ซึ่งก็คือชนิดข้อมูล String , StringBuilder และ StringBuffer นั่นเอง
สายอักขระ
จากโปรแกรม HelloWorld!
จะเห็นว่า ค าที่พิมพ์ออกมานั้นประกอบไปด้วย H,e,l,l,o,... เรียงต่อกัน เราจึงเรียกว่า สายอักขระ (String)
public class hello_world {public static void main(String args[]) {System.out.println(“Hello World!”);
}}
คลาสสตริง (String class)
• เนื่องจากสายอักขระมีประโยชน์มากมาย ภาษาจาวาจึงมีชนิดข้อมูลที่น าเสนอสายอักขระได้ แต่ชนิดข้อมูลที่น าเสนอสายอักขระนี้ไม่จัดเป็นข้อมูลชนิดพื้นฐาน แถมยังมีลักษณะพิเศษเพิ่มเติมเข้ามา เราจึงใช้ค าว่า คลาส (class) แทนค าว่าชนิดข้อมูล (data type)
Java String• สายอกัษร (String) ในภาษาจาวา
▪ ไม่ใช่เป็นเพยีงเน้ือที่ในหน่วยความจ าที่จองไว้ส าหรับประเภทข้อมูล แต่เป็นวตัถุ (Object)
• ตัวแปร String ในภาษาจาวา▪ เกบ็ค่าอ้างองิของ String Object▪ เม่ือมีการอ้างองิค่าไปยงั String Object แล้ว จะไม่สามารถเปลีย่นแปลงค่าใน String Object ได้โดยตรง แต่สามารถให้ค่าอ้างองิใหม่ได้
String message = new String("Hello");
String message = "Hello";
หรือ
• การประกาศตัวแปร String ในภาษาจาวา
String Declaration (1)
1 String empty = new String("");2 String message = "Hello";3 String repeat = message;
""
xxx
yyy
zzz
aaa
bbbString
""
empty
stored at xxxstored at aaa
After
Line 1
aaaString
""stored at aaa
Conceptual View Memory Address View
String Declaration (2)
1 String empty = new String("");2 String message = "Hello";3 String repeat = message;
" Hello"
message
stored at yyybbb
String
”Hello"stored at bbb
stored at bbb
""
xxx
yyy
zzz
aaa
bbb
String
""
empty
stored at xxxstored at aaa
After
Line 2aaa
String
""stored at aaa
Conceptual ViewMemory Address
View
String
”Hello"
""
xxx
yyy
zzz
aaa
bbbString
""
empty
stored at xxxstored at aaa
After
Line 1
aaaString
""stored at aaa
Conceptual View Memory Address View
• การประกาศตัวแปร String ในภาษาจาวา
String Declaration (3)
1 String empty = new String("");2 String message = "Hello";3 String repeat = message;
Repeat
stored at zzz
" Hello"message
stored at yyybbb
String
”Hello"stored at bbb
stored at bbb
""
xxx
yyy
zzz
aaa
bbb
String
""
empty
stored at xxxstored at aaa
After
Line 3aaa
String
""stored at aaa
Conceptual ViewMemory Address
View
String
”Hello" bbb
" Hello"
message
stored at yyybbb
String
”Hello"stored at bbb
stored at bbb
""
xxx
yyy
zzz
aaa
bbb
String
""
empty
stored at xxxstored at aaa
After
Line 2aaa
String
""stored at aaa
Conceptual ViewMemory Address
View
String
”Hello"
• การประกาศตัวแปร String ในภาษาจาวา
The “String” Class• String Classค่าใน String Object ไม่สามารถเปลีย่นแปลงได้ แต่สามารถ
ให้ค่าอ้างองิจากตวัแปร String ใหม่ ได้• Methods ของ String Class
Create New Stringconcat, replace, subString, toLowerCase, toUpperCase
Searchendswith, startswith, indexOf, lastIndexOf
Comparisonequals, equalsIgnoreCase, CompareTo
otherscharAt, length
String Comparison• การเปรียบเทียบ String ในภาษาจาวา
เปรียบเทยีบค่าใน String Object ว่าเท่ากนัหรือไม่ใช้เมทธอด boolean equals(String s)
เปรียบเทียบว่าตัวแปร String อ้างองิถึง String Object เดียวกนัหรือไม่
ใช้โอเปอร์เรเตอร์ (Operator) “==”เปรียบเทียบค่าใน String Object เรียงตามล าดับตัวอกัษร
ใช้เมทธอด int compareTo(String s)return ค่า 0 เม่ือเป็นค่าเดียวกนั, ค่าจ านวนเต็มบวกเม่ือ String
Object นีม้ากกว่า s และ ค่าจ านวนเต็มลบ เม่ือ String Object นี้น้อยกว่า s
String greeting = new String("Hello" );String message = "Hello";if (greeting.equals(message)) { System.out.println("equal content!"); }else { System.out.println("content NOT equal!"); }
Comparing String Contents
• ตัวอย่าง
"Hello"
message
stored at yyybbb
String
"Hello"stored at bbb
stored at bbb
"Hello"
xxx
yyy
zzz
aaa
bbb
String
"Hello"
greeting
stored at xxxstored at aaa
aaa
String
"Hello"
stored at aaa
Conceptual ViewMemory Address
View
String
"Hello"
.equals()
String greeting = new String("Hello" );String message = "HEllo";if (greeting.equals(message)) { System.out.println("equal content!"); }else { System.out.println("content NOT equal!"); }
Comparing String Reference
String greeting = new String("Hello" );String message = "Hello";if (greeting == message) { System.out.println("equal reference!"); }else { System.out.println(”reference NOT equal!"); }
"Hello"
message
stored at yyybbb
String
"Hello"stored at bbb
stored at bbb
"Hello"
xxx
yyy
zzz
aaa
bbb
String
"Hello"
greeting
stored at xxxstored at aaa
aaa
String
"Hello"
stored at aaa
Conceptual ViewMemory Address
View
String
"Hello"
• ตัวอย่าง
Comparing String Lexicographical Order
String greeting = new String("Hello" );String message = ”World";System.out.println(greeting.compareTo(message));
• การเปรียบเทยีบค่า String ตามล าดับตัวอกัษรใช้เมทธอดint compareTo(String s)return ค่า 0 เม่ือเป็นค่าเดียวกนัreturn ค่าจ านวนเต็มบวกเม่ือ String Object นีม้ากกว่า s return ค่าจ านวนเต็มลบ เม่ือ String Object นีน้้อยกว่า s
String Concatenation
String greetings = new String("Hello”);int ThisYear = 2001;String name = " World " + 2001;String message = greetings + name;
• การน า String มาเช่ือมต่อกนัใช้โอเปอร์เรเตอร์ Concatenate (+) แต่ไม่สามารถเปรียบเทียบ String โดยใช้โอเปอร์เรเตอร์แบบ
Relational (>, <, >=, <=) และโอเปอร์เรเตอร์แบบ Equality ( ==, !=) ได้
• หมายเหตุใช้โอเปอร์เตอร์ (+) กบั String ได้เม่ือมีพจน์ใดพจน์หน่ึงเป็น String
String
• วัตถุ String สามารถน าเสนอข้อมูลที่เป็นสายอักขระได้ การใช้งานสตริงมีขั้นตอนดังต่อไปนี้
1. การประกาศตัวแปร โดยเขียน ค าว่า String แล้วตามด้วยชื่อตัวแปรString name;
2. การก าหนดค่า ให้กับตัวแปร name ให้ใช้เครื่องหมาย = และสร้างวัตถุ String ด้วยค าสั่ง new
name = new String(“Nattapong Songneam”)
3. แสดงผลด้วยค าสั่ง System.out.println(name);
การส่ังงาน String
• วัตถุ String ไม่เพียงแค่ใช้เก็บบันทกึสายอักขระและแสดงผลออกมาเท่านั้น แต่ยังมีความสามารถพิเศษ อื่นอีกดังนี้
1. การนับความยาวของสายอักขระ จะใช้ lenght()name.lenght();
2. แสดงตัวอักษรในต าแหน่งที่ก าหนด จะใช้ charAt()name.charAt(1);
3. แสดงต าแหน่งของสายอักขระในสตริง จะใช้ indexof()name.indexof(“a”);
3. หาสตริงในช่วงที่ก าหนด จะใช้ substring()name.substring(1,3);
จงเขียนค าสัง่ เพ่ือหาวา่ ....ก มีในช่ือ นศ. หรือไม่ ถา้มี อยูล่ าดบัท่ีเท่าไร
• .....................................................................................................................................................................................................................................................................................................................
*** ไม่นับช่องว่าง
จงเขียนโปรแกรม ค าสัง่ ตวัอกัษรท่ี 4 ของช่ือ นศ.
• .................................
การสัง่งาน String
public class TestString01 {
public static void main(String args[]) {
String Name =“Nattapong Songneam”;
System.out.println(name.lenght());
System.out.println(name.charAt(3));
System.out.println(name.indexof(“S”));
System.out.println(name. substring(1,9));
}
}
การเปรียบเทียบ String
public class TestString02 {
public static void main(String args[]) {
String Name1 =“Nattapong Songneam”;
String Name2 =“Supaporn Jarnsuk”;
if(Name1 == Name2) {
System.out.println(“name is as once”);
} else {
System.out.println(“name is as once”);
}
}
}
การเปรียบเทียบ String
public class TestString01 {
public static void main(String args[]) {
String Name1 =“Nattapong Songneam”;
String Name2 =“Supaporn Jarnsuk”;
if(Name1.equal(Name2)) {
System.out.println(“name is as once”);
} else {
System.out.println(“name is as once”);
}
}
}
การประยกุตใ์ชง้าน String กบัการเขา้รหสัขอ้มูล
package encrypt;/*** @author Nattapong Songneam* http://www.siam2dev.com* [email protected] */public class Main {
public static void main(String[] args) {String KEY = new String("zxcvbnmasdfghjklqwertyuiop");char KeyTable[][]= new char[26][2];
for(int i=0;i<26;i++) {KeyTable[i][0] =(char)('a' + i); KeyTable[i][1] = (KEY.charAt(i));
}String PlainText = "Nattapong Songneam";String CipherText="";int Len = PlainText.length();for(int k=0;k<Len;k++) {
for(int i=0;i<26;i++) {char a = KeyTable[i][0];char b = PlainText.charAt(k);if(a==b) {
CipherText +=Character.toString(KeyTable[i][1]);}}
}System.out.println(CipherText); }
}
คลาส Math
• ชนิดข้อมูลพื้นฐานที่เปน็ตัวเลข เชน่ int หรือ double นั้น สามารถน ามาค านวณได้ ภาษาจาวามีค าสั่งส าหรบัการค านวณงา่ย ๆ เช่น การบวก ลบ คูณ หาร ซึ่งส าหรับการค านวณที่ซับซ้อนขึ้น เช่น การค านวณ ตรีโกณมิติ ลอกการิทึม นั้น ภาษาจาวา ก็ท าได้เช่นกันโดย ภาษาจาวาได้ จัดเตรียมคลาส Math ไว้ช่วยในการค านวณให้เรยีบร้อยแล้วดังนี้
เมธอดต่าง ๆ ใน คลาส Math
sqrt() cbrt() pow() abs() ceil() floor() round() min() max()
โปรแกรมค านวณค่า พ.ท. วงกลม
public class TestMath01 {
public static void main(String args[]) {
double r = 10.0d; // r = radius
double circleArea= Math.PI*r*r
System.out.println(circleArea)
}
}
โปรแกรมค านวณค่า พ.ท. วงกลม แบบท่ี 2
public class TestString01 {
public static void main(String args[]) {
double r = 10.0d; // r = radius
double circleArea= Math.pi*Math.pow(r,2);
System.out.println(circleArea)
}
}
แบบฝึกหดั 5.1 จงเขียนโปรแกรมเพ่ือหาค่า
โปรแกรมค านวณค่า เสน้รอบ วงกลม
public class TestString01 {
public static void main(String args[]) {
double r = 10.0d; // r = radius
double circular = 2*Math.pi*r;
System.out.println(circular)
}
}
public static void main(String[] args) {// TODO code application logic hereint x=2;long y= (long)(2*Math.pow(x,8) + 5*Math.pow(x,6)
+ 3*Math.pow(x,3) + 2*x + 7);System.out.println(y);
}
โปรแกรมค านวณค่า โปรแกรมสุ่มตัวเลข 1-100
public class TestMath03 {public static void main(String args[]) {
for(int i=1;i<100;i++) {int k = (int)(Math.random()*100);System.out.println(k);
}}}
การรับขอ้มูลจากผูใ้ชง้าน ทางคียบ์อร์ด
java.util.Scanner sc;
sc = new java.util.Scanner(System.in);
int y = sc.nextInt(); // รับข้อมูลที่เป็น ตัวเลขจ ำนวนเตม็ int
double y = sc.nextDouble(); // รับข้อมูลที่เป็น ตัวเลขทศนิยม double
String y = sc.next() // รับข้อมูลที่เป็นข้อควำม String
Exercise 5_1
• จงเขียนโปรแกรม รับ ค่า ความกว้าง , ความสูง จาก คีย์บอร์ดแล้ว ค านวณ ค่า พ.ท. สี่เหลี่ยมผืนผ้า
• จงเขียนโปรแกรม รับ ค่า ความกว้าง , ฐาน จาก คีย์บอร์ดแล้ว ค านวณ ค่า พ.ท. สามเหลี่ยม
• จงเขียนโปรแกรม ค านวณ ค่า พ.ท. สี่เหลี่ยมคางหมู โดย รับ ข้อมูลต่าง ๆ จากคีย์บอร์ด
คลาสในกลุ่ม Format
import java.text.DecimalFormat;
double d = sc.nextDouble();DecimalFormat cF = new DecimalFormat("0.00");
System.out.println(cF.format(d));
DecimalFormat cF = new DecimalFormat(“#,###.00");
System.out.println(cF.format(d));
แทรกค าสั่ง ก่อนpublic class Main {
Java Programming
[Class library]By
Nattapong Songneam
http://www.siam2dev.com
Java Class library• java เป็นภาษาขนาดเลก็ เพราะมีเพียงกลไกพืน้ฐานส าหรับการโปรแกรมทัว่ไปและท่ีเก่ียวกบัการโปรแกรมเชิงวตัถเุท่านัน้ แตไ่ด้กลไกเฉพาะอยา่งถกูสร้างขึน้เป็นคลาสเก็บไว้ใน standard libraryของภาษา คือไฟล์ classes.zip ท่ีมากบั jdk ซึง่คลาสจ านวนมากจะเก็บไว้ใน package มาตรฐานของภาษา มีช่ือวา่ java ซึง่จะถกูแบง่เป็น sub-package ยอ่ย ๆ ลงไปส าหรับแตล่ะงาน เช่น java.io. เป็นท่ีเก็บคลาสเก่ียวกบั stream เป็นต้น
java.lang• มีคลาสท่ีส าคญั ๆ เช่น
String,math,System,Object,Runtime,Process,Class,Compiler,SecurityManager– คลาส String มี constructors หลายตวัดงันี ้
• public String();
• public String(String value);
• public String(char[] value);
• public String(char[] value,int offset,int count);• public String(StringBuffer buffer);
//string
class StringDef {
public static void main(String args[]) {
String a = new String(“sawatdee”);
String b = new String();
String c = “sawatdee”;
char d[] = {‘s’,’a’,’w’,’a’,’t’,’d’,’e’,’e’};
String e = new String(d);
String f = new String(d,0,4);
byte g[] = {‘s’,’a’,’w’,’a’,’t’,’d’,’e’,’e’};
String h = new String(g);
}
}*คลาส string ยงัม ีmethod ทีจ่ าเป็นส าหรับใช้งานมากมาย เช่น length(),charAt(),substring(), trim(),valueOf()
java.util.*• ประกอบด้วยคลาสที่ส าคัญ ๆ ดังนี้
– Enumeration /เก็บกลุ่มข้อมูล เรียกมาดูทีละตัว– Vector / เก็บกลุ่มข้อมูลที่ไม่ทราบล่วงหน้าว่ามีจ านวนเท่าใด– Stack / ใช้เป็น polymorphism คือ สมาชิกใน stack อาจเป็น instance
ของคลาสใดก็ได้– BitSet / สร้าง bit vector คือ vector ขนาดไม่จ ากัด แต่สมาชิกเป็น 1 bit
เก็บค่า boolean– Dictionary / ส าหรับสร้างคลาสเพื่อเป็นแหล่งเก็บข้อมูลของคู่ล าดับ ใน
ลักษณะ <key, value>– Hashtable /ขยายจาก dictionary โดยใช้ hash code ของ key เป็น
index และ value อาจเป็น instance ของคลาสใด ๆ– Properties / ขยายจาก hashtable เพ่ือเป็นแหล่งเก็บข้อมูลคู่ล าดับของ
string กับ string
•StringTokenizer / ส าหรับตัด string หนึ่งออกเป็นล าดับของ tokens
•Date / เก็บข้อมูลเกี่ยวกับ เวลา และวันที่
•Random / คลาสมีฟังก์ชันส าหรับสร้างล าดับของเลข random
•java.util.zip Package
•GZIPOutputStream /filter stream ส าหรับบีบอัดข้อมูล
•GZIPInputStream / filter stream ส าหรับขยายข้อมูล
•ZipOutputStream /filter stream ส าหรับบีบอัดข้อมูลเพื่อส่งออก
output stream ที่น ามาต่อไว้
•ZipInputStream / filter stream ส าหรับขยายข้อมูลเพ่ือส่งเข้า
input stream ที่น ามาต่อไว้
//mydate.javapublic class mydate {
public static void main(String args[]) {Date d = new Date();System.out.println(d);System.out.println(d.getTime());
Date d1 = new Date(1000000L);System.out.println(d1);System.out.println(d1.getTime());System.out.println(d.after(d1));System.out.println(d.before(d1));System.out.println(d.equals(d1));
}}
java.io.*• package ที่สนับสนุนการอ่าน-เขียนไฟล์ string sockets
– File /มีไว้เพื่อให้ทราบข้อมูลและจัดการไฟล์หรือไดเรกทอรี คลาสนี้ไม่มี method ส าหรับสร้างไฟล์ใหม่ขึ้นมา แต่มี renameTo() ส าหรับเปลี่ยนชื่อไฟล์ และ delete()ส าหรับลบไฟล์
//myfile.javaimport java.io.*;class myfile {
public static void main(String args[]) throws IOException{
File f =new File("myfile.java");System.out.println("File name :" +f.getName());System.out.println("Path :" +f.getPath());System.out.println("Parent:" +f.getParent());System.out.println("AbsolutePath :" +f.getAbsolutePath());System.out.println("isAbsolute :" +f.isAbsolute());System.out.println("exists :" +f.exists());System.out.println("isFile :" +f.isFile());System.out.println("isDirectory :"+f.isDirectory());System.out.println("Writeable :" +f.canWrite());System.out.println("Readable :" +f.canRead());System.out.println("Length :" +f.length()); }
}
• RandomAccessFile//myRandomfile.javaimport java.io.*;class myRandomFile {
public static void main(String args[]) throws IOException
{RandomAccessFile f = new RandomAccessFile("myRandomFile.java","r");
f.seek(15);System.out.println(f.readLine());f.seek(3);System.out.println(f.readLine());
}}
• FileInputStream / FileOutputStream ส าหรับอ่านและสง่ byte stream ออกไปท่ีไฟล์ ซึง่ถ้ามีอยู่แล้วจะเขียนทบัของเดิม แต่ถ้าไมม่ีจะเป็นการสร้างใหม ่โดยใช้ read() & write() method
//myfileStream.java
import java.io.*;
class myfileStream {
public static void main(String args[]) throws IOException
{
int n = 0;
byte b[] = new byte[128];
FileInputStream inf =new FileInputStream("myRandomFile.java");
FileOutputStream outf =new FileOutputStream("mytmpFile.java");
while ((n =inf.read(b))!= -1)
outf.write(b,0,n);
inf.close();
outf.close(); }}
Top Related