Lec05 1 :: สายอักขระ...String , StringBuilder และ StringBuffer• ชน...

Post on 24-Jan-2020

4 views 0 download

Transcript of Lec05 1 :: สายอักขระ...String , StringBuilder และ StringBuffer• ชน...

Lec05_1 :: สายอกัขระ String , String Builder and String Buffer

การเขยีนโปรแกรมจาวา (4121309)

โดย อ. นัฐพงศ ์ สง่เนยีม

http://www.siam2dev.net

siam2dev@Hotmail.com

xnattapong@hotmail.com

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* xnattapong@hotmail.com */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(); }}