The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.

Introduction to Programming Java Language

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by ปิติ เกตุ, 2021-03-22 04:12:52

Introduction to Programming Java Language

Introduction to Programming Java Language

บทที่ 3: การตดั สินใจ และการประมวลผลแบบวน

count++; //number of tokens read

sum += number; //calculate sum

break; intro. to Java (FEU.faa)

default:

System.out.println("Token is not a number! " +

token.toString());

break;

}

}

เราตรวจสอบความเปนตวั เลขของ token ไดดวยการเปรยี บเทยี บ token.ttype กบั
StreamTokenizer.TT_NUMBER และถาเปน จริง token ท่ีเปนตัวเลขจะถูกเก็บไวในตัวแปร nval
(และมชี นดิ เปน double) ดังนัน้ ตัวแปร number จงึ ตองประกาศใหเ ปน double และการดึงคามาเก็บ
ในตวั แปร number ทาํ ไดด ว ยการกําหนดคาจากประโยค

number = token.nval;

เนอื่ งจากวา เราสนใจเฉพาะ token ท่เี ปน ตัวเลขเทา นน้ั เราจึงไมส นใจ token ทีเ่ ปนชนิดอ่ืน ดังนั้นเรา
จึงเพยี งแตสง คา ของ token กลับคนื ไปยังหนา จอถา token น้ันเปน ชนดิ อน่ื ทีไ่ มใชตวั เลข

for loop ของเราจะทํางานไปเรอื่ ย ๆ จนกวา user จะกดปุม <enter> ซึง่ การกดปมุ <enter> น้ีจะ
ทาํ ให expression ท่ีมอี ยเู พียงตวั เดียวใน for loop เปนเท็จ การทาํ งานของ for loop จึงสิน้ สดุ ลง
ผอู านจะสังเกตไดวาเราไมส นใจกบั expression ที่ 1 และ expression ที่ 3 ของ for loop เลยทั้งน้กี ็
เพราะวาเราไมตองมกี ารกาํ หนดคา เบ้อื งตน หรอื เพม่ิ คาใด ๆ เลย การยุตกิ ารทาํ งานของ for loop
เกดิ จากการกดปมุ <enter> ของ user เทานัน้

ผลลพั ธของการ run ดวยคาสมมติตา ง ๆ

Enter numbers (space between - enter when done): 20 30 45 789 12 34
Sum of numbers = 930.0
Average of numbers = 155.0

Enter numbers (space between - enter when done): 45 68 95
Sum of numbers = 208.0
Average of numbers = 69.33

Class StreamTokenizer ยังมี field อืน่ ๆ ที่เราสามารถเรียกใชได แตไ มไ ดก ลา วไวในทน่ี เ้ี พราะวา
โปรแกรม AddNumbers.java ของเราสนใจแตเฉพาะการอานตัวเลขเทา นน้ั ผูอานสามารถหาขอ มลู
ไดจาก javadoc ของ Sun เอง

การอา นขอมูลจากโปรแกรมการบวกเลขที่เราเหน็ น้ันมีขน้ั ตอนที่ยุงยาก (ดงั ทไ่ี ดกลา วไวแ ลว ) แตเ รา
นําแสดงใหดูก็เพื่อใหเ ห็นวาทําได แตก ม็ ีวธิ ที ส่ี ้นั กวา นัน่ ก็คือการใช Class Scanner เหมือนกับท่ีเรา
ไดทํามากอ นหนาน้ี โปรแกรม SumOfNumbers.java แสดงถงึ การใช class Scanner ในรูปแบบท่ี
คลายกนั กบั โปรแกรม AddNumbers.java

1: /**
2: Reading numbers from input line

3: */

4:
5: import static java.lang.System.out;
6: import java.util.Scanner;

7:
8: class SumOfNumbers {
9: public static void main(String[] args) {
10: double number, sum = 0;

11: int count = 0;

12:
13: out.print("Enter numbers: ");

14: Scanner input = new Scanner(System.in);

15:
16: //loop through numbers until EOF is found
17: //for windows: <ctrl/z>

18: for(; input.hasNext(); count++) {
19: sum += input.nextDouble();

20: }
21:

97

เรม่ิ ตนการเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)

22: //calculate average and display result
23: double average = sum / count;
24: out.printf("Sum of numbers is %.0f\n", sum);
25: out.printf("Average of numbers is %.2f\n", average);
26: }
27: }

การนําขอ มลู เขาเรมิ่ ตนดว ยการตรวจสอบวา input มีขอมูลอยหู รือไมดว ยการใชค าํ ส่งั

input.hasNext()

ซึง่ ถา hasNext() สง คา ทเี่ ปน จริงกลบั มาเราก็จะรวู ามีขอ มูลอยู และจะทาํ ใหเราสามารถดึงขอมูล
ออกมาไดดว ยคาํ ส่ัง (บรรทดั ท่ี 19)

sum += input.nextDouble()

ทง้ั น้ี user จะตอ งใสข อมูลโดยมีชอ งวางอยรู ะหวา งเหมอื นกับโปรแกรมกอนหนา น้เี ชนเดยี วกนั แต
การบอกใหโ ปรแกรมรูว า การนําขอ มูลเขา ไดสิ้นสดุ ลง เราตอ งกดปมุ <enter> ตามดว ย <ctrl/z>
และกดปมุ <enter> อีกครั้งหนง่ึ ดงั ทแ่ี สดงจากตวั อยา งผลลัพธนี้

Enter numbers: 1 2 3 4 5
^Z
Sum of numbers is 15
Average of numbers is 3.00

ผอู านจะเหน็ วา โปรแกรมของเราสัน้ ลงกวา เกามาก และกไ็ ดผ ลเชน เดยี วกนั ถึงแมวา การยตุ ิการนาํ
ขอมลู เขา จะยงุ ยากกวาก็ตาม

เราสามารถท่จี ะเรยี กใช scanner ในการอานขอ มูลจาก dialog box ไดเ ชน เดยี วกบั ทเ่ี ราใช scanner
อานขอมูลจาก command line วิธกี ารกไ็ มยาก เพยี งแตเ ปลย่ี นการสง ชอ งทางนําขอ มลู เขา ของ
scanner จาก System.in ใหเปน การอานจาก String ทเี่ ก็บขอมลู จาก dialog box ดังนี้

String in = JOptionPane.showInputDialog(null,
"Enter int values (separate by space)",
"Sum of numbers", JOptionPane.QUESTION_MESSAGE);

Scanner input = new Scanner(in);

ซ่ึงเราไดแ สดงการใชด งั กลาวในโปรแกรม SumDialog.java ทเ่ี ห็นนี้

1: /**
2: Reading numbers from dialog box using scanner
3: */
4:
5: import java.util.Scanner;
6: import javax.swing.JOptionPane;
7:
8: class SumInDialog {
9: public static void main(String[] args) {
10: double number, sum = 0;
11: int count = 0;
12:
13: //getting numbers from a dialog box
14: String in = JOptionPane.showInputDialog(null,
15: "Enter int values (separate by space)",
16: "Sum of numbers", JOptionPane.QUESTION_MESSAGE);
17:
18: Scanner input = new Scanner(in);
19:
20: //loop through numbers and add them up
21: for(; input.hasNext(); count++) {
22: sum += input.nextDouble();
23: }
24:
25: //calculate average
26: double average = sum / count;
27:

98

บทที่ 3: การตัดสนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)

28: //display result via dialog box
29: JOptionPane.showMessageDialog(null, "The sum is " +
30: String.format("%.0f\n", sum) +
31: "Average is " + String.format("%.2f\n", average),
32: "Sum of numbers", JOptionPane.INFORMATION_MESSAGE);
33: }
34: }

เราเก็บขอมูลที่ user ใสใน dialog box ไวในตวั แปร in ซึ่งเมอ่ื เราไดแลวเรากส็ งตัวแปร in นใ้ี หก บั
scanner (ในบรรทัดท่ี 14 และ 18 ตามลาํ ดบั ) ผลลพั ธของการทดลอง run โปรแกรมก็เปน อยางที่
เราคาดไวคือ

ในการใช for/loop นนั้ เราสามารถทีจ่ ะใช , (comma) เปน ตัวแบงการประมวลในแตล ะ expression
ได ดังตัวอยางโปรแกรมการหาผลรวมและคา เฉลยี่ นของเลขจากหนง่ึ ถึงรอ ย

1: /**
2: Adding numbers using for/loop
3: with comma
4: */
5:
6: import static java.lang.System.out;
7:
8: class SumUsingFor {
9: public static void main(String[] args) {
10: int i, sum;
11:
12: for(i = 1, sum = 0; i <= 100; sum += i, i++) ;
13:
14: out.printf("Sum = %d%n", sum);
15: out.printf("Average = %.2f", (double)sum / (i-1));
16: }
17: }

เรากําหนดให expression1 ของเรามขี อ ความอยสู องขอ ความคือ i = 0 และ sum = 0 โดยเราใช ,
เปนตัวแบงขอ ความทง้ั สอง เชนเดียวกันกับ expression3 เรากําหนดใหมีขอ ความ sum += i และ
i++ อยู และในตวั for/loop นั้นเราไมม ีการกาํ หนดประโยคใด ๆ เลย ทงั้ น้ีกเ็ พราะวาเราไดก ําหนดให
การหาผลรวมน้นั อยูใน expression3 แลว แตเ ราจะตอ งใส ; (หรือเราอาจใส {})เพือ่ ให Java รวู าเรา
ไดจ บ for loop ของเราแลว

for(i = 1, sum = 0; i <= 10; sum += i, i++) ;

หรือ

99

เร่ิมตนการเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)

for(i = 1, sum = 0; i <= 10; sum += i, i++) { }

การทาํ งานของ for/loop ท่วี า นี้กเ็ หมือนกันกบั การเขยี น for/loop แบบเดมิ ตางกันตรงทีเ่ ราไดย า ย
ตําแหนงของประโยคสองประโยค เทา น้นั เอง

sum = 0;
for(i = 1; i <= 10; i++)

sum += i;

ตําแหนง ของขอ ความการหาผลรวมกม็ คี วามสาํ คัญ เราตอ งกําหนดใหป ระโยค sum += i นนั้ อยกู อ น
ประโยค i++ ทง้ั น้ีก็เพราะวา Java จะประมวลผลประโยคท่ีอยทู างซายของเคร่อื งหมาย , กอน แลว
จึงจะประมวลผลประโยคทอี่ ยถู ัดไปทางขวา ซงึ่ ถา เรากําหนดให i++ อยกู อ น sum += i การ
ประมวลผลของเราก็จะผดิ พลาด คา ของผลรวมทไี่ ดคลาดเคลือ่ น

สวนท่สี ําคญั อีกสวนหนึ่งกค็ อื คาของ i สําหรบั การคาํ นวณหาคา เฉล่ีย เราตอ งหกั คาของ i ออกหนึง่
คา กอ นนาํ ไปหาร sum กเ็ นอ่ื งจากวาในขณะท่ี for/loop ยุตกิ ารทํางานนน้ั คา ของ i มีคาเปน 101

การหาผลรวมของ for/loop ทีก่ ลาวมาแลว นนั้ เราสามารถท่ีจะเขียนไดอีกหลายรูปแบบ เชน

i=;
sum = 0;
for( ; i <= 100; i++) ;

sum += i;

หรือ

i = 1;
sum = 0;
for( ; i <= 100; ) {

sum += i;
i++;
}

หรอื

sum = 0;
for( i = 1; i <= 100; ) {

sum += i;
i++;
}

ผูอา นควรคํานงึ ถงึ การเขียน code ท่ีดแู ลวอานไดงาย มีโครงสรางทม่ี องดเู ปนสากล ดงั นนั้ ถงึ แมวา
Java จะยอมใหเ ราเขียน code ไดอ ยางอสิ ระและหลายรูปแบบ เรากไ็ มควรเขยี น code ทย่ี ากตอการ
ทําความเขาใจ ยกเวนวา การเขียน code นัน้ ๆ มคี วามจําเปนท่ตี อ งใชรปู แบบนนั้ ๆ ในการเขียน
(จําเปนจริงหรือ?)

3.4.1.1 การใช for-in/loop (for-each)

Java 1.5 ไดก าํ หนดใหม กี ารใช for/loop อกี รูปแบบหนึ่งทีเ่ รียกวา for-in/loop ซ่งึ เปน for/loop ท่ี
ใชในการดึงเอาขอ มลู ออกมาจากทีเ่ กบ็ เชน ขอมูลท่ีเก็บอยใู น array ซง่ึ เราจะพูดถึงในบทที่ 4 แต
เน่ืองจากวาเราตองการใหผูอา นไดร ูจกั ถึง for-in/loop นีอ้ ยางครา ว ๆ กอน เราจงึ ไดน าํ เอาตวั อยาง
ของ for-in/loop มาแสดงใหด ใู นที่น้ี

โปรแกรมตวั อยางที่เราแสดงใหด ูเปน โปรแกรมงาย ๆ ทร่ี บั ขอมูลมาจาก command-line โดย user
จะเปนผูใสข อ มูลถัดจากช่ือของโปรแกรม เชน ถา โปรแกรมของเราชือ่ ForInLoop เราก็จะเรยี กใช
โปรแกรมดวยคาํ สง่ั ทเี่ ห็นนี้ พรอมท้ังใสข อมลู ของโปรแกรมตามหลงั คอื I love for/loop

d:\source>java ForInLoop I love for/loop

โปรแกรมตัวอยางของเรามีหนา ตาดงั น้ี

1: /**

100

บทที่ 3: การตดั สนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)

2: Using for-in/loop
3: */
4:
5: import javax.swing.JOptionPane;
6:
7: class ForInLoop {
8: public static void main(String[] args) {
9: //get each word from command-line
10: //and display them
11: for(String str : args) {
12: JOptionPane.showMessageDialog(null,
13: str, "Words in sentence",
14: JOptionPane.INFORMATION_MESSAGE);
15: }
16: }
17: }

ผอู า นจะเห็นวา ในบรรทดั ท่ี 11 เราเรยี กใช for-in/loop ในการดงึ เอาขอ มูลออกจากตวั แปรท่ีชอ่ื args
ซึง่ เปน command-line argument ของตวั โปรแกรมเองโดยทชี่ นดิ ของขอ มลู จะตองเปนชนดิ
เดียวกนั กบั ท่เี ขามา และทไี่ ดก ําหนดไวใ น for-in/loop ดงั ทเี่ ราไดทาํ ไว รูปแบบของ for-in/loop มี
ดังนี้

for(declaration : expression)
statement

จากรูปแบบของ for-in/loop และที่เราไดเขียนไวในบรรทดั ที่ 11

declaration คอื String str
expression คอื args (args ของเราเปน array ทีเ่ กบ็ String)

พดู ภาษางาย ๆ กค็ ือ for-in/loop ท่ีเราใชใ นบรรทดั ท่ี 12 เปน loop ทบ่ี อกใหเ กิดการทํางานทีว่ า

"สาํ หรับ String str ทุกตัวทอี่ ยใู น args" เราจะทํากระบวนการตอ ไปนี้ …

สิ่งที่เราทําไมไดใ น for-in/loop กค็ ือการทาํ แบบทว่ั ไปกับ loop ตา ง ๆ ที่เราเคยทาํ เชน ถาเรา
ตอ งการดึงเอาขอมูลจากตําแหนง ใด ๆ ใน loop หรือแสดงขอ มลู ณ ตําแหนง น้ันๆ เปน ตน ขอ ควร
ระวังในการใช for-in/loop ก็คือ

expression จะตอ งเปน array หรือ object ท่มี าจาก java.lang.Iterable
declaration โดยท่ัวไปจะเปน ชนิด และตัวแปร (การประกาศตวั แปรน่ันเอง)

เราจะกลบั มาดูตวั อยางการใช for-in/loop อกี ในบทอืน่ ๆ ตอไป

3.4.2 การใช while/loop

การใช while/loop ก็คลาย ๆ กับการใช for/loop ตา งกนั เฉพาะโครงสรา งบางโครงสรา งเทานั้นเอง
(ตาํ แหนง ของ expression) เรามาดโู ครงสรางของ while/loop กัน

while(expression)
statement

while/loop จะตรวจสอบวา คาของ expression นน้ั เปน จรงิ หรือเท็จ ถา เปน จริงก็จะประมวลผล
ประโยคตา ง ๆ ทีอ่ ยภู ายใน while/loop และจะประมวลผลประโยคอน่ื ๆ ที่ตามมา (ภายนอก while/
loop) หลงั จากท่ีหลุดออกจาก while/loop แลว ภาพท่ี 3-5 แสดงขัน้ ตอนการทํางานของ while/
loop

101

เริม่ ตน การเขยี นโปรแกรมดว ย Java

Expression no intro. to Java (FEU.faa)
(จรงิ ?)

yes
statement

Next statement

ภาพที่ 3-5 ขนั้ ตอนการทาํ งานของ while/loop

เรามาลองใช while/loop แทน for/loop ทเ่ี ราไดใ ชในโปรแกรมตวั อยา งบางตวั กอ นหนา น้ี

1: /**

2: Adding numbers using while/loop

3: */

4: import static java.lang.System.out;

5:

6: class SumUsingWhile {

7: public static void main(String[] args) {

8: int i, sum;

9:

10: //initialize i and sum

11: i = 0;
12: sum = 0;

13:

14: //repeat process as long as i

15: //less than or equals to 100

16: while(i <= 100) {

17: sum += i; //add i to sum

18: i++; //increment i

19: }

20:

21: //print sum and average

22: out.printf("Sum = %d%n", sum);
23: out.printf("Average = %.2f", (double)sum / (i-1));

24: }

25: }

สิง่ แรกทเี่ ราตองทํากค็ อื การกาํ หนดคา เบอ้ื งตน ใหกับตวั แปร i และ sum หลงั จากน้ันเรากท็ ําการ
ตรวจสอบดูวาประโยค i <= 10 เปนจรงิ หรอื ไม ซึง่ ถา เปน จรงิ เราก็ให while/loop ของเราทําการบวก
คา ของ i เขากับตัวแปร sum พรอมท้ังเพิม่ คาใหก ับ i เม่อื เสร็จแลว ถา เราลองเปรยี บเทียบการใช
while/loop กบั for/loop เราจะเหน็ วา ประโยค

i = 0;
sum = 0;

คอื expression ท่หี นึง่ ของ for/loop และประโยค i <= 10 ก็คอื expression ทส่ี องใน for/loop
สว นประโยค i++ ก็คอื expression ทส่ี ามใน for/ loop นนั่ เอง (ถึงแมวาเราไดก ําหนดคาของ i ให
เรมิ่ ตนท่ี 0 กไ็ มทาํ ใหก ารประมวลผลเปล่ยี นไป เพียงแตว า loop ของเราทํางานมากข้ึนอกี หนงึ่ คร้งั
เทานั้น)

ทนี ีเ้ รามาลองใช while/loop แทน for/loop ในโปรแกรม AddNumbers.java พรอ มทง้ั เปลยี่ นการ
อานขอมลู และการแสดงผล

102

บทท่ี 3: การตดั สนิ ใจ และการประมวลผลแบบวน

1: /** intro. to Java (FEU.faa)

2: Calculating sum and average of numbers

3: using split() to get each token from input string

4: */

5:

6: import javax.swing.JOptionPane;

7: import static java.lang.System.out;

8:
9: class AddNumbers2 {

10: public static void main(String[] args) {

11: double number, sum = 0; //a number and sum

12: int count = 0; //total numbers read

13: String input; //input string

14:

15: //get input from user

16: input = JOptionPane.showInputDialog("Enter numbers: ");
17: String[] tokens = input.split("\\s");

18: while(count < tokens.length) {

19: try {
20: number = Integer.parseInt(tokens[count]);

21: sum += number;

22: count++;

23: }

24: //display error and exit from program

25: catch(Exception e) {

26: JOptionPane.showMessageDialog(null,

27: "Invalid input: " + tokens[count] +
28: "\nBefore invalid input\n" +

29: "Sum is " +

30: String.format("%.0f", sum) +

31: "\nAverage is " +

32: String.format("%.2f", (sum/count)),

33: "Error",

34: JOptionPane.ERROR_MESSAGE);

35: System.exit(1);

36: }

37: }

38: //calculate average and display result

39: double average = sum / count;

40: JOptionPane.showMessageDialog(null,

41: "Sum of numbers: " + input + " is " +

42: String.format("%.2f%n", sum) +

43: "Average of numbers: " +

44: String.format("%.2f", average),

45: "Sum and Average",

46: JOptionPane.INFORMATION_MESSAGE);

47: }

48: }

ในโปรแกรม AddNumbers2.java เราจะใช method split() ของ class String เปน ตวั ดึงเอาขอมลู
ออกจาก String ที่ user ใสเ ขามาแทนการใช StreamTokenizer ดงั ทีเ่ ห็นในบรรทดั ท่ี 173 ซงึ่ ขอมลู
แตล ะตวั ทถี่ ูกดงึ ออกมานน้ั เราจะนาํ ไปเกบ็ ไวใน array ชือ่ tokens การดึงขอ มลู แตล ะตวั ออกมานนั้
เราตอ งกาํ หนดให split() รูวาเราใชอะไรเปน ตวั กาํ หนดการแบงขอ มลู ท่มี ีอยูใน input ในทีน่ ้ีเราใช
ชองวาง (space) เปนตวั แบงโดยเราตองบอกให split() รูดวยการใช \s แตเน่ืองจากวา \s เปน
escape sequence เราจึงตองกาํ หนดใหม ี '\' อีกหน่งึ ตัวนาํ หนา '\s'

หลังจากน้นั เรากเ็ ขา หาขอมลู แตละตวั ดว ย while/loop โดยเรียกใช length เปนตัวกําหนดจาํ นวนคร้ัง
ของการวน loop และเราจะคาํ นวณหาผลรวมของขอ มลู ทเ่ี ปน Integer เทา นนั้ ถาหากวามขี อมลู ตวั
ใดก็ตามท่ไี มใ ช Integer โปรแกรมกจ็ ะยุตกิ ารทาํ งานพรอมทงั้ สง ผลรวมและคา เฉล่ยี ของขอ มูลท่ี
ถกู ตองมีอยูกอนหนา ออกทางหนา จอ สว นการแสดงผลของขอ มูลทีถ่ ูกตองกเ็ ปน ไปตามปกติ ดงั
ตวั อยา งน้ี

3 เราใชโ ครงสรา งท่ีเรยี กวา array ในการเกบ็ ตัวเลขแตละตัว ซ่งึ เราจะไดอธิบายอยางละเอยี ดตอ ไปในบทที่ 4

103

เรมิ่ ตนการเขียนโปรแกรมดวย Java

จากผลลพั ธจะเหน็ วาโปรแกรมจะยตุ ิการประมวลผลถา เจอขอมลู ท่ีไมใ ช Integer ตง้ั แตต ัวแรกท่ีเจอ intro. to Java (FEU.faa)
ซงึ่ ตา งจากการใช StreamTokenizer กอนหนา นี้ที่ยังสามารถประมวลผลเฉพาะขอ มลู ท่ีถกู ตอ ง
ทงั้ หมดท่ีมอี ยู

ท้งั for/loop และ while/loop เปน โครงสรา งของการทํางานแบบวนที่ตองมกี ารตรวจสอบกอนวา
ประโยคในการควบคุมของ loop ทั้งสองเปน จรงิ หรือเท็จ ซ่ึงหมายถงึ วาการทาํ งานของ loop ท้ังสอง
อาจไมเกดิ ขน้ึ เลยถา การประมวลผลประโยคควบคมุ เปน เทจ็ แตถาเราตอ งการท่ีจะประมวลผลกอน
อยางนอยหน่งึ ครัง้ เราจะทาํ อยา งไร

3.4.3 การใช do-while/loop

Java มีโครงสรา งการใช loop อกี ตวั หน่ึงท่ียอมใหม ีการทาํ งานอยางนอ ยกอ นหนึง่ คร้งั แลว จึงจะทาํ
การประมวลผลประโยคควบคุม น่นั ก็คือ do-while/loop ซง่ึ มโี ครงสรางดังน้ี

do {
statement

}
while(expression);

statement

yes Expression
(จริง ?)

no
statement
ภาพที่ 3-6 ขนั้ ตอนการทํางานของ do-while/loop

104

บทท่ี 3: การตัดสินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)

ถาเราตองการที่จะทํางานอยางนอ ยหนงึ่ ครง้ั กอ นที่จะมกี ารตรวจสอบเพื่อยตุ ิการทํางาน หรือทํางาน
ตอ ไป do-while/loop จะเปนโครงสรา งที่เหมาะสมทีส่ ุด โปรแกรมตวั อยางตอไปนี้แสดงถงึ การใช
do/while loop ในการตรวจสอบนน้ั ๆ

1: /**
2: do/while loop demonstration
3: until user enter a letter other than 'y'
4: */
5:
6: import static java.lang.System.out;
7: import java.util.Scanner;
8:
9: class DoWhile {
10: public static void main(String[] args) {
11: int score;
12: char grade, ch;
13: Scanner input = new Scanner(System.in);
14:
15: do {
16: //get input string
17: out.print("Enter your score: ");
18: score = input.nextInt();
19:
20: //determine grade by given score
21: if(score > 90)
22: grade = 'A';
23: else if(score > 80)
24: grade = 'B';
25: else if(score > 70)
26: grade = 'C';
27: else if(score > 60)
28: grade = 'D';
29: else
30: grade = 'F';
31:
32: out.println("Your grade is " + grade);
33: out.print("\nDo you want to continue? <y/n> : ");
34: String response = input.next();
35: ch = (char)response.charAt(0);
36: }
37: while(ch == 'y' || ch == 'Y');
38: }
39: }

เราเพียงแตด ดั แปลงโปรแกรมการหาเกรดของเรา ดวยการเพิม่ do/while และประโยค

out.print("\nDo you want to continue? <y/n> : ");
String response = input.next();
ch = (char)response.charAt(0);

ทใี่ ชสาํ หรับการถาม user วา ตองการทาํ งานตอ หรอื ไม โดยเราทําการดึงเอาตัวอักษรตวั แรกทอ่ี ยใู น
บรรทัดนนั้ ออกมา ทําการเปรยี บเทียบกบั ตัวอักษร y ใน expression ของ do-while/loop ซง่ึ ถา การ
เปรียบเทียบนนั้ เปน จริงเราก็จะทํางานไปเร่ือย ๆ วธิ ีการเดียวทีจ่ ะทาํ ให do-while/loop ยตุ กิ ารทาํ งาน
ก็คอื การใสตวั อักษร n (หรอื อนื่ ๆ ทไี่ มใ ช y)

เราใช method chatAt() ดว ยคา parameter ที่เปน ศูนยเพ่อื ดึงเอาอกั ษรตัวแรกสดุ ใน buffer มาเก็บ
ไวในตัวแปร ch สําหรับการเปรียบเทยี บประโยคควบคุมของ do-while/loop

ผลลพั ธก าร run โปรแกรมดว ยคา ตา ง ๆ

Enter your score: 89
Your grade is B

Do you want to continue? <y/n> : y
Enter your score: 12
Your grade is F

105

เรมิ่ ตนการเขยี นโปรแกรมดวย Java

Do you want to continue? <y/n> : y intro. to Java (FEU.faa)
Enter your score: 75
Your grade is C

Do you want to continue? <y/n> : n

เรามาลองดูโปรแกรมตัวอยางอีกตวั หนึง่ ที่ใช do-while/loop ในการหาผลรวมของเลขระหวาง 1 –
100

1: /**

2: Adding numbers using do-while/loop

3: */
4:

5: import static java.lang.System.out;

6:

7: class SumUsingDoWhile {

8: public static void main(String[] args) {

9: int i = 0; //loop counter

10: int sum = 0; //sum of i

11:

12: //repeat process until i is

13: //no longer less than or equal to 100

14: do {

15: sum += i; //add i to sum

16: i++; //increment i

17: }

18: while(i <= 100);

19:

20: out.printf("Sum = %d%n", sum);

21: out.printf("Average = %.2f", (double)sum / (i-1));

22: }

23: }

ซงึ่ เมื่อ run ดูก็ไดผลลพั ธด ังน้ี

Sum = 5050
Average = 50.5

เราไมไ ดเ ปลย่ี นแปลงอะไรมากมายใน loop ของเราเพียงแตเ ปลยี่ นมาใช do-while/loop เทาน้ันเอง
การใช do-while/loop รับรองวา จะเกดิ การทํางานอยา งนอ ยหน่ึงครง้ั เสมอดงั ทเ่ี ห็นจากตวั อยางทัง้
สอง เพราะฉะน้ันถาผอู า นไมต อ งการตรวจสอบเง่อื นไขกอ นการประมวลผล do-while/loop กเ็ ปน
ตัวเลอื กที่คอ นคา งเหมาะสมท่สี ดุ

3.5 การใช break และ continue

หลาย ๆ คร้ังทเี่ ราตองการยุติการทาํ งานของ loop โดยท่ี loop ยังไมส ิ้นสดุ การทํางานของมันเอง
เชน กาํ หนดให loop หยุดการทํางานเมอื่ เงื่อนไขทไี่ ดก าํ หนดไวเ ปน จริง ดงั แสดงใหเหน็ ในโปรแกรม
ตวั อยางน้ี

1: /**

2: Using break to get out of the loop
3: */

4:

5: import static java.lang.System.out;
6:
7: class SumWithBreak {

8: public static void main(String[] args) {
9: int i = 1, sum = 0;

10:
11: //repeat the task until i > 200
12: do {

13: sum += i;
14: i++;
15:

16: //break out of loop when i > 100
17: if(i > 100)
18: break;

106

บทท่ี 3: การตัดสินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)

19: }
20: while(i <= 200);
21:
22: out.println("Sum = " + sum);
23: out.println("Average = " + (double)sum / (i-1));
24: }
25: }

เราใชโปรแกรม SumWithBreak.java เปน พน้ื ฐานของการเปลยี่ นแปลง โดยเรากําหนดใหม ีการ
ตรวจสอบคา ของ i วา มากกวา 100 หรือไมซึง่ ถาเปน จรงิ เรากจ็ ะ break ออกจาก loop ทันที

if(i >= 100)
break;

เมอ่ื เราลอง run ดเู ราไดผลลัพธด ังน้ี

Sum = 5050
Average = 50.5

ลองมาดโู ปรแกรมท่ีใช break ในการหยุดการทาํ งานของ loop ทใี่ ชห าคาของตวั เลขทรี่ ะหวางหน่ึง
ถึงสิบทเี่ ปนเลขคู

1: /**
2: Using break in a loop
3: */
4:
5: class Break {
6: public static void main(String[] args) {
7:
8: for(int number = 1; ; number++)
9: if(number % 2 == 0) {
10: System.out.println("Number is " + number);
11:
12: //break out of loop when number >= 10
13: if(number >= 10)
14: break;
15: }
16: }
17: }

เราจะตรวจสอบวา ตัวเลขเปนเลขคกู อนแลว จึงทาํ การแสดงตัวเลขนนั้ ๆ ไปยังหนา จอเมื่อคาของ
number เปนสบิ เราก็จะยุติการทํางานของ loop ดงั ท่แี สดงใหเ ห็นจากผลลพั ธท่ีไดน้ี

Number is 2
Number is 4
Number is 6
Number is 8
Number is 10

การใช break ใน loop เปน การกาํ หนดให loop หยดุ การทํางานทันที ท่เี จอ break แตถ า เราตอ งการ
ทีจ่ ะกระโดดขามคําสัง่ หรอื ชุดคาํ ส่งั ทมี่ ีอยูเมอ่ื เงือ่ นไขบางอยา งเปนจรงิ เราตองใช continue แทน
ดงั โปรแกรมตวั อยางนี้

1: /**
2: Using continue in a loop
3: */
4:
5: import static java.lang.System.out;
6:
7: class Continue {
8: public static void main(String[] args) {
9:
10: for(int number = 1; number <= 10; number++) {
11:
12: //skip if number is 5
13: if(number == 5) {
14: out.printf("%d is skipped!%n", number);
15: continue;

107

เรม่ิ ตน การเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)

16: }
17:
18: out.println("Number is " + number);
19: }
20: }
21: }

การประมวลของประโยคในบรรทัดที่ 18 จะเกิดขนึ้ ทุกคา ของ number ยกเวนเมอ่ื คา ของ number มี
คาเทา กบั หา ดงั แสดงใหเหน็ จากผลลพั ธนี้

Number is 1
Number is 2
Number is 3
Number is 4
5 is skipped!
Number is 6
Number is 7
Number is 8
Number is 9
Number is 10

การใช continue นนั้ โดยท่วั ไปมักจะไมค อยมที ใ่ี ชเทาไรนัก เพราะการเขยี นโปรแกรมโดยท่วั ไปมกั จะ
ทาํ การประมวลผลกลุมของคาํ สั่งทัง้ หมดจนเสร็จ หรอื ไมกย็ ุติการทาํ งานเม่อื เงื่อนไขบางอยางเปน
จรงิ การกระโดดขา มการประมวลผลชดุ คําส่งั ไมค อ ยจะมีใหเห็นมากมายนัก ดังน้นั กค็ งตองขึ้นอยกู บั
การออกแบบโปรแกรมของผูอานเองวา เหมาะสมอยางไรตอการใชช ดุ คําส่ังตา ง ๆ

3.6 การใช loop ใน loop (Nested Loop)

เราสามารถท่จี ะนาํ เอา loop ตาง ๆ ท่ีเราไดพ ูดถึงมาใสไ วใน loop ได เชน เดยี วกับท่ีเราทาํ กับ if –
else เนื่องจากวา ตัว loop เองกเ็ ปนประโยคอยางหนึ่ง ดังนั้นการนําประโยคมาวางซอนกนั ในการ
เขยี นโปรแกรมกย็ อมทีจ่ ะทําได เรามาลองดตู ัวอยา งการใช nested loop กนั

1: /**
2: Using loop inside another loop
3: */
4:
5: class NestedLoop {
6: public static void main(String[] args) {
7:
8: for(int row = 1; row <= 10; row++) {
9: for(int column = 1; column <= 10; column++) {
10:
11: //break out of inner loop when
12: //column is greater than row
13: if(column > row)
14: continue;
15: System.out.print("*");
16: }
17: System.out.println();
18: }
19: }
20: }

โปรแกรม NestedLoop.java ของเราใช for/loop สองตวั ในการแสดงจํานวนของ '*' ในแตละแถว
ดงั ทแี่ สดงใหเ หน็ จากผลลพั ธน้ี

*
**
***
****
*****
******
*******
********
*********
**********

108

บทท่ี 3: การตดั สนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)

ใน for/loop ตวั แรกของเรา เราใชต ัวแปร row เปน loop index ซงึ่ จะประมวลผลเปนจํานวนเทากับ
สิบคร้งั และในแตละครง้ั ท่ี row มีการประมวลผล for/loop ตัวทสี่ องทม่ี ี column เปน loop index จะ
ประมวลผลเปนจํานวนเทากบั สิบครง้ั เพราะฉะน้นั การประมวลผลของ for/loop ทัง้ สองตัวจึงมีคา เปน
จาํ นวนเทา กับหน่ึงรอยคร้งั

ทกุ ๆ การประมวลผลของ for/loop ตวั ทสี่ องเราจะตรวจสอบวาคา ของ column มากกวาคา ของ row
หรอื ไม ซงึ่ ถามากกวา เราจะหยุดการแสดงคา '*' ไปยงั หนาจอทันทีดวยการเรยี กใช continue ที่เรา
ไดพดู ถึงกอนหนาน้ี

ในขณะที่ row และ column มคี าเทากับหน่ึงน้ันเราก็สง '*' ไปยงั หนา จอ หลังจากนัน้ column กม็ ีคา
เปนสอง ซง่ึ มีคา มากกวา row การกระโดดขา มจงึ เกิดขึน้ ซ่ึงจะเปน ไปจนกระทง่ั column มคี า เทากับ
สบิ เอ็ดการประมวลผลของ for/loop ดานในจึงยตุ ิลง หลังจากนั้น row กม็ ีคา เปนสอง เหตกุ ารณเ ดมิ
กเ็ กิดข้นึ อกี แตต อนนกี้ ารแสดงผล '*' จะมีเพ่ิมขึ้นจนกวา คาของ column จะมากกวา row เปนเชน นี้
ไปเรอ่ื ย ๆ จนกระทง่ั คา ของ row มคี าเปนสบิ เอ็ดการประมวลผลของ for/loop ดา นนอกจงึ ยตุ ลิ ง

โดยความเปนจรงิ แลวเราสามารถทจี่ ะใช break แทนการใช continue ได ซึ่งกจ็ ะไดผลลพั ธ
เหมอื นกนั ทั้งนี้เพราะการใช break จะทาํ ใหเ ราหลดุ ออกจาก for/loop ดานในทันที ซ่งึ เปน การ
ประมวลผลทีด่ กี วา การใช continue เนอื่ งจากวา เราประมวลผล for/loop ดา นในดว ยจํานวนครัง้ ท่ี
เทากบั คา ของ row ทเ่ี ปน อยขู ณะนัน้ (ผอู านควรตรวจสอบดวู าการประมวลผลของ for/loop ดานในมี
จาํ นวนเทา กับก่ีครงั้ ในทุก ๆ การประมวลผลของ for/loop ดา นนอก - ทกุ คาของ row)

ลองมาดูโปรแกรมตัวอยางอีกโปรแกรมหน่ึงที่ใช Nested – loop ในการแสดงผลของตัวเลขทเี่ รยี ง
กันเปนรปู สามเหลยี่ ม

1: /**
2: Triangle of numbers
3: */
4:
5: import static java.lang.System.out;
6:
7: class NumberTri {
8: public static void main(String[] args) {
9: int row, col;
10: int num;
11:
12: for(row = 0; row <= 7; row++) {
13: //print leading blanks
14: for(col = 1; col <= 7 - row; col++)
15: out.print(" ");
16: //print left half
17: for(col = 0; col <= row; col++) {
18: num = (int)Math.pow(2, col);
19: //print 4 blanks for a single digit number
20: //print 3 blanks for two-digit number
21: //print 2 blanks for three-digit number
22: if(num < 10)
23: out.print(" " + num);
24: else if(num < 100)
25: out.print(" " + num);
26: else
27: out.print(" " + num);
28: }
29: //print same format as before
30: for(col = row - 1; col >= 0; col--) {
31: num = (int)Math.pow(2, col);
32: if(num < 10)
33: out.print(" " + num);
34: else if(num < 100)
35: out.print(" " + num);
36: else
37: out.print(" " + num);
38: }
39: out.println();
40: }
41: }
42: }

109

เรมิ่ ตน การเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)

ผลลัพธท ีไ่ ดจากการ run โปรแกรม NumberTri.java คือ

1
12 1
124 2 1
1248 4 2 1
1 2 4 8 16 8 4 2 1
1 2 4 8 16 32 16 8 4 2 1
1 2 4 8 16 32 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1

เราไดทาํ การตรวจสอบถงึ คา ของตวั เลขทจี่ ะแสดงไปยงั หนาจอวา เปน ตัวเลขก่ี digit โดยเราจะ
กําหนดใหมีการเวน ชอ งวา งไวดานหนาตวั เลขตามคา ของ digit น้นั ๆ เชน ตัวเลขหนงึ่ digit เราจะ
แสดงชอ งวาง 3 ชอง ตวั เลข 2 digit เราจะแสดงชองวา ง 2 ชอ งและตวั เลขสาม digit เราจะแสดง 1
ชอ ง เพือ่ การเรียงลาํ ดบั ตัวเลขทดี่ แู ลวสวยงาม

3.7 การใช Label continue และ Label break ใน for loop

Java ยอมใหมกี ารใช label ในการหยุดและเรมิ่ การประมวลผลใหม ซง่ึ โปรแกรมเมอรหลาย ๆ ทาน
ไมค อยจะเหน็ ดวยกบั การใชการประมวลผลในลักษณะนเี้ ทา ใดนกั เรามาดูตวั อยา งกนั

1: /**
2: Using a label/continue
3: */
4:
5:
6: class LabeledContinue {
7: public static void main(String[] args) {
8:
9: label: for(int row = 1; row <= 10; row++) {
10: System.out.println();
11:
12: for(int col = 1; col <= 10; col++) {
13:
14: //go to label when column
15: //is greater than row
16: if(col > row)
17: continue label;
18:
19: System.out.print("*");
20: }
21: }
22: }
23: }

เราไดด ัดแปลงโปรแกรม Continue.java ของเราสําหรับการแสดงการใช labeled continue ใน
โปรแกรม LabeledContinue.java เรากาํ หนดใหมี identifier ท่ีมชี อ่ื วา label อยกู อนหนา for loop
ดา นนอกของเรา ซง่ึ ตองมเี คร่ืองหมาย ':' ตามหลงั เสมอ และในการใช continue ใน for loop ดาน
ในนนั้ เราจะตองมี identifier ทเ่ี ราใชต ามหลงั continue เสมอ

การประมวลดว ย labeled continue ก็ไมย ากนกั ที่จะทําความเขา ใจ เมื่อคา ของ col มากกวา คา ของ
row การทํางานใน for/loop ดา นในก็ส้นิ สดุ ลงและไปเรม่ิ ตนใหมท ่ี for/loop ดา นนอก เพราะนนั่ เปน
ทท่ี ีม่ ี label อยู การทํางานแบบนีก้ เ็ หมอื นกบั การกระโดดไปยงั ตาํ แหนง ท่ีเราตองการจะไปน่ันเอง
ทั้งน้ีก็ตอ งขน้ึ อยูกบั เงื่อนไขท่เี ราไดตั้งไว (ผลลพั ธเ หมือนเดมิ คอื )

*
**
***
****
*****
******
*******
********
*********

110

บทท่ี 3: การตัดสนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)

ถา เราเปลีย่ น continue ใหเปน break เราจะไดผ ลลพั ธอ ะไร เรามาลองดโู ปรแกรมที่ใช labeled
break กันดู

1: /**
2: Using label/break
3: */
4:
5: import java.io.*;
6:
7: class LabeledBreak1 {
8: public static void main(String[] args) {
9:
10: label: for(int row = 1; row <= 10; row++) {
11: System.out.println("Before inner loop");
12:
13: for(int column = 1; column <= 10; column++) {
14: //break at label when column
15: //is greater than row
16: if(column > row)
17: break label;
18:
19: System.out.print("*");
20: }
21:
22: System.out.println("After inner loop");
23: }
24: System.out.println("\nAfter outter loop");
25: }
26: }

เราไดเพิม่ ประโยคทง้ั กอนและหลงั for/loop ดา นในของเราเพอื่ จะไดด ูวา การประมวลผลเกิดขน้ึ ที่
ใดบา ง ผลลัพธทเ่ี ราไดค อื

Before inner loop
*
After label

ขอความทีอ่ ยใู นบรรทัดที่ 24: System.out.println("After inner loop"); จะไมไดรับการประมวลผล
ท้งั น้กี เ็ พราะวาคําสั่งของ break กาํ หนดใหการทํางานยุติลงที่ label

เราสามารถท่จี ะมี label block ก่ี block ก็ไดในโปรแกรมของเรา การใช labeled break ถาใชไ ด
อยางเหมาะสมแลวจะทําใหก ารเขยี น code เปนไปไดอ ยางสะดวกยง่ิ ขน้ึ ท้ังนก้ี เ็ พราะวาเราสามารถท่ี
จะกระโดดไปยัง block ตา ง ๆ ไดอยา งงาย ๆ

ลองดโู ปรแกรมตัวอยา งอีกตวั หน่ึงท่ีใช labeled break ในการหาผลคณู ของเลขระหวาง 1 – 5

1: /**
2: Using label/break
3: */
4:
5: import static java.lang.System.out;
6:
7: class LabeledBreak {
8: public static void main(String[] args) {
9: int prod = 1;
10: int i = 1;
11:
12: here: while(true) {
13: //calculate product
14: prod *= i++;
15:
16: //go to label: here when i
17: //is greater than 5
18: if(i > 5)
19: break here;
20: else
21: out.printf("Value of prod is %d%n", prod);
22: }
23:

111

เร่มิ ตน การเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)

24: out.println("\nFinal product is " + prod);
25: }
26: }

เราใช while/loop ทท่ี าํ งานอยตู ลอดเวลาโดยไมม กี ารกาํ หนดใหห ยดุ (ใช true ใน expression) แต
เรากําหนดใหมกี ารหยุดจากการใช labeled break ใน while/loop เอง ตวั โปรแกรมจะคาํ นวณหาผล
คณู ไปจนกวา คา ของ i จะเปนหา ก็จะ break ออกจาก block ทช่ี อ่ื here ทนั ที และจะไปประมวลผล
ประโยคที่อยถู ัดมาจาก block ซ่งึ ก็คอื System.out.println("\n Final product is " + prod) ทาํ ให
เราไดผ ลลัพธดงั นี้

Value of prod is 1
Value of prod is 2
Value of prod is 6
Value of prod is 24
Final product is 120

Loop เปน โครงสรางท่ีใชม ากในการเขียนโปรแกรมตา ง ๆ ท้ังนี้เพราะ loop เอ้อื อาํ นวยใหผเู ขียน
เรยี กใชชุดคําสั่งตา ง ๆ ซ้าํ กนั ได ทาํ ใหการเขียนโปรแกรมลดขั้นตอนการทํางานลง และการทํางาน
ของโปรแกรมก็กระชับย่ิงขน้ึ เราจะกลับมาพูดถึง loop อกี หลาย ๆ คร้งั ในบทตอ ๆ ไป โดยเฉพาะใน
เร่ืองของ Array และ String
สรุป
ในบทน้เี ราไดพูดถงึ การใชป ระโยคของการเปรียบเทียบ และการตดั สนิ ใจ การใชประโยคควบคุมการ
ทํางาน การใช loop ในการประมวลผลตดิ ตอ กนั โดยรวมแลว เราไดพดู ถึง
9 การใช if และ if-else
9 การใช nested-if
9 การใช Conditional operator (? :)
9 การใช switch
9 การใช loop ตา ง ๆ เชน for/loop for-in/loop while/loop และ do-while/loop
9 การใช break continue และการใชประโยคท่ใี ช label
แบบฝก หัด
1. จงเขียนโปรแกรมท่ีรับ int จาก keyboard จํานวน 10 ตวั หลังจากนนั้ ใหคาํ นวณหาผลรวม และ

คาเฉล่ียของขอ มูลท้งั 10 ตวั ใหส ง ผลลัพธออกทางหนา จอ
2. จงหาผลลพั ธของ code ตอไปนโี้ ดยไมใช compiler ชว ย

class Loops {
public static void main(String[] args) {
int index = 1;
while(index != 9) {
index += 2;
System.out.println(index);
index--;
}
}

}

112

บทท่ี 3: การตดั สินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)

class Loops1 {
public static void main(String[] args) {
int index1, index2;

index1 = 33;
index2 = 1;

while(index1 < index2) {
index1 = index1 + 10;
System.out.println(index1);
index2 = index2 * 2;

}
}
}

class Loops2 {
public static void main(String[] args) {
int index = 1;

while(index != 33) {
index++;
System.out.println(index);
index++;

}
}
}

class Loops4 {
public static void main(String[] args) {
int j, k = 1;

while(k < 7) {
j = 5;
while(j > 0) {
System.out.println("j = " + j);
System.out.println("k = " + k);
j--;
}
k *= 2;

}
}
}

class Loops5 {
public static void main(String[] args) {
int j = 10, k = 1;

while(k < 8) {
while(j > 0) {
System.out.println("j = " + j);
System.out.println("k = " + k);
j--;
}
k = k * 2;

}
}
}

3. จงเขียนโปรแกรมที่สรางตวั เลขแบบสมุ จํานวน 100 ตวั เสร็จแลวใหแ สดงผลลพั ธอ อกทาง
หนา จอเฉพาะตัวเลขท่เี ปน เลขคเี่ ทานน้ั โดยกาํ หนดใหการแสดงผลเปน 10 ตวั ตอ หนงึ่ บรรทดั

4. จากโจทยใ นขอ 2 แทนท่ีจะแสดงผลเปนเลขคใี่ หแ สดงผลเฉพาะที่เปนเลขคูเทานั้น โดยแสดง
เฉพาะเลขคูทีม่ ากกวา 20 เทา นัน้

5. จงเขียนโปรแกรมทแี่ สดงตัวอักษรตงั้ แต A ไปจนถึง Z ดวยการใช while/loop โดยไมมกี ารรบั
คา ใด ๆ จาก keyboard

6. จงเขยี นโปรแกรมทีค่ าํ นวณหาคาท่เี ล็กท่ีสดุ ในกลุมตัวอกั ษรท่ีอา นเขา มาจาก keyboard ทีละตวั
(ตวั อกั ษรท่นี าํ เขา ควรมจี าํ นวนไมนอ ยกวา 10 ตวั )

113

เร่ิมตนการเขยี นโปรแกรมดวย Java

7. จงเขยี นโปรแกรมทีอ่ า นขอ มูล 2 ตัวจาก keyboard โดยทตี่ วั แรกเปน หมายเลขของสินคา intro. to Java (FEU.faa)
(product number) และตัวทสี องเปน จํานวนท่ีขายไปในแตละวัน (quantity sold) กาํ หนดใหมี
สินคา อยู 5 ชนิดท่ีมีราคาตางกนั ดังน้ี

สินคา ท่ี 1 ราคา 500.0 บาท
สนิ คา ที่ 2 ราคา 750.0 บาท
สินคา ท่ี 3 ราคา 850.0 บาท
สนิ คาท่ี 4 ราคา 950.0 บาท
สินคาท่ี 5 ราคา 1000.0 บาท

โปรแกรมจะคํานวณหายอดเงนิ ทขี่ ายไดของสนิ คา ทกุ ตวั ในอาทิตยทีผ่ านมา โดยที่จํานวนของ
สินคาแตล ะชนิดทข่ี ายไปจะนําเขามาจาก keyboard โปรแกรมท่ีเขียนขนึ้ ตอ งใช switch ในการ
แยกแยะราคาของสนิ คา แตล ะชนดิ ทีเ่ ขามา ใหแ สดงผลลพั ธอ อกทางหนา จอ

8. จงเขยี นโปรแกรมทแ่ี สดงผลลัพธ ดงั ท่ีเห็นน้ี ดวยการใช loop เทานนั้

*********** **********
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *

9. จงเขียนโปรแกรมทรี่ ับคา int หน่ึงตวั (n) ท่มี ากกวา ศูนย หลงั จากน้ันใหแ สดงผล ดงั นี้

1 2 3 ... n-1 n
1 2 3 … n-1

123
12
1

10. จงเขยี นโปรแกรมท่รี บั คาเปน วัน เดอื น ป จาก keyboard หลงั จากนั้นใหแสดงตาํ แหนงของวันที
น้นั ในป เชน 12 29 2002 จะแสดงเปน 363

11. จงเขียนโปรแกรมท่รี ับคาตา งๆ จาก keyboard เฉพาะท่เี ปน 0 มากกวา ศนู ย และนอ ยกวาศนู ยให
นับจาํ นวนของคาท้ังสามวา มอี ยางละก่ีตัว โปรแกรมจะหยดุ ทาํ งานไดก ต็ อ เม่ือ user ใสขอ มูลท่ี
ไมใชต วั เลข

12. จงเขยี นโปรแกรมท่ีรบั คาระหวา ง 1 – 100 หลงั จากนน้ั ใหแ สดงคา ทีร่ ับเขา มาในรูปแบบของ
ตวั หนงั สอื เชน ถาขอ มลู เขาเปน 11 ผลลัพธท ่ีไดค ือ สบิ เอ็ด

13. จงเขียนโปรแกรมท่ที ําการเขา รหัสของขอ มูลที่นําเขา จาก keyboard โดยนําเอาตัวอกั ษรทอี า น
เขา บวกกบั คา ของตัวอกั ษรทอ่ี ยถู ัดไป 2 ตัวอกั ษร mod ดวยจํานวนของตัวอักษรทีม่ อี ยู (26 ตัว
ในภาษาองั กฤษ) เชน ถา คา นาํ เขา เปน a ผลลัพธท ีไ่ ดจากการเขารหัสจะเปน a + c ซ่ึงจะมีคา
เทากบั 97 + 99 =196 % 26 = 14 ใหใ ชคา นี้เปนตัวบอกตาํ แหนงของตวั อักษรท่ีจะแสดงไป
ยงั หนาจอ ซ่ึงตวั อกั ษร ณ ตําแหนง ที่ 14 นคี้ ือ n

14. จงเขยี นโปรแกรมท่ีรับคา เปน ประโยคทางคณติ ศาสตร เชน 9 + 5 – 2 * 4 + 2 /3 หลงั จากนน้ั
ใหทําการประมวลผลประโยคดงั กลา ว ตามลาํ ดบั ของขอ มูลทน่ี าํ เขา

15. จงเขียนโปรแกรมทร่ี บั คา เดือนทีเ่ ปน ตัวเลขระหวาง 1 – 12 หลงั จากนั้นใหแสดงผลเปนจาํ นวน
ของวนั ท่ีมีอยูในเดอื นดังกลา ว

114

บทที่ 3: การตัดสนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)

16. จงเขียนโปรแกรมที่คาํ นวณหา ตวั หารรว มมาก (GCD – Greatest Common Divisor) ของ
ตัวเลขสองตวั ทรี่ ับเขา มาจาก keyboard เชน gcd ของ 24 และ 15 คอื 3
Note: gcd ของ x และ y คอื integer ทีใ่ หญทสี่ ดุ ทห่ี าร x และ y ลงตวั

17. จงเขียนโปรแกรมทคี่ าํ นวณหา ตวั คูณรวมนอย (LCM – Least Common Multiple) ของตวั เลข
สองตัวทร่ี บั เขามาจาก keyboard เชน lcm ของ 24 และ 15 คอื 120
Note: LCM ของ x และ y คือ integer ท่นี อ ยท่สี ดุ ที่ทง้ั x และ y หารลงตวั

18. จงเขยี นโปรแกรมที่หา factor ของตัวเลขท่รี บั เขามาจาก keyboard เชน ถา ขอมลู เทากบั 18
factor ทไ่ี ดคอื 2 3 และ (18 = 2 * 3 * 3)

19. จงเขียนโปรแกรมท่มี ี menu ให user ในการเลอื กการทํางานระหวางการหา LCM หรือการหา
GCD การออกจากโปรแกรมจะถกู กาํ หนดโดย user

20. จงเขยี นโปรแกรมท่ีคาํ นวณหาผลลัพธของ series ทีใ่ หน ้ี
1/3 + 3/5 + 5/7 + 7/9 + 9/11 + … + 95/97 + 97/99

21. จงเขียนโปรแกรมทค่ี าํ นวณหาคาของ pi ดว ย series ท่ีใหน้ี
pi = 4(1 – 1/3 + 1/5 – 1/7 + 1/9 – 1/11 + 1/13 - … - 1/(2i – 1) + 1/(2i +1))

22. จงเขยี นโปรแกรมที่คาํ นวณหารคาของ e ดว ย series ทใ่ี หน้ี
e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + … + 1/i!

115

เรม่ิ ตนการเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)

116

ในบทนเ้ี ราจะมาศึกษาถึงการสรางและใช array ซงึ่ เปน โครงสรา งอกี ตัวหน่งึ ทท่ี าํ ใหเราสามารถเกบ็ intro. to Java (FEU.faa)
ขอ มลู ทเ่ี ปน ชนิดเดยี วกันหลาย ๆ ตัวไวใ นตัวแปรตัวเดียว รวมไปถงึ การสรา งและใช string ซ่ึงจะเปน
การแนะนําใหผ ูอานไดร ูจักกับ object ในภาษา Java แบบคราว ๆ

หลงั จากจบบทเรียนนแี้ ลว ผอู า นจะไดทราบถึง

o การประกาศและกาํ หนดคาให array
o การเขา หาขอ มูลในตําแหนงตา ง ๆ ทีอ่ ยูใน array
o การสรา ง array ทใ่ี ชเ ก็บ array
o การสราง object ท่เี ปน string
o การสรางและใช array ท่เี กบ็ object
o การใชก ระบวนการตา ง ๆ กบั object ที่เปน string

4.1 อารเรย (Array)

array เปน โครงสรางชนดิ หน่งึ ทีป่ ระกอบไปดวยขอมูลชนดิ เดยี วกันทีอ่ าจมีมากกวา หน่งึ ตัว การเขา หา
ขอมูลแตล ะตัวท่ีอยูใ น array จะตอ งทําผา นทาง ช่อื ของ array และ index ท่ีมคี าเปน integer (int)
ประกอบกัน Java ไดก ําหนดให index ตวั แรกสดุ ทีเ่ ก็บขอมูลมคี าเปน 0 และจะเพ่มิ ขน้ึ ทีละหนึง่ คา ไป
เร่ือย ๆ จนกวาจะหมดขอ มลู ที่มอี ยูใน array น้ัน ๆ การประกาศตวั แปรทเ่ี ปน array ทําไดดงั น้ี

datatype[] nameOfArray;

เชน

int[] listOfNumbers;
double[] prices;
char[] vowels;

ในการประกาศ array เราจะตองกาํ หนดจํานวนของขอ มูลที่ตองการเกบ็ พรอมทั้งชนดิ ของขอมลู ทจ่ี ะ
เกบ็ ไวใน array นนั้ เครือ่ งหมาย [] จะเปน ตัวบอกให Java รูวา ตัวแปรที่ถูกสรา งข้นึ มาน้ีเปน array
และเครื่องหมายนกี้ ็จะเปน ตัวทีใ่ ชในการเขาหาขอมลู แตละตัวใน array หนงั สือหลาย ๆ เลม เลอื กที่
จะประกาศ array ในรปู แบบท่ีเห็นดา นลางนี้ ซง่ึ มีความหมายเหมือนกันกับท่ีเราไดประกาศกอนหนาน้ี

int listOfNumbers[];
double prices[];
char vowels[];

สําหรับหนงั สอื เลม นี้เราจะใชก ารประกาศในแบบท่หี น่ึง

หลงั จากที่เราไดประกาศใหต ัวแปรเปน array แลว เราก็ตอ งกาํ หนดความจใุ หกบั array น้นั ดังน้ี

listOfNumbers = new int[5];

ประโยคทเี่ ราไดเขยี นข้นึ นนั้ บอกให Java รูว าเราตองการให Java จองเน้ือท่ใี นการเกบ็ int เปน
จํานวนเทากับ 10 ตวั ใหกับตัวแปร listOfNumbers ซง่ึ ตวั แปรน้ีจะเปนตัวอางองิ (reference) ถึง
ขอมลู ทงั้ หมดท่ไี ดถูกเกบ็ ไวใน array น้ี ภาพที่ 4-1 แสดงถงึ สิง่ ตา ง ๆ ท่ีเกดิ ขึ้นเม่ือเราประกาศการ
ใช array

เริ่มตน การเขยี นโปรแกรมดว ย Java

ประกาศ array ท่ี ชอื่ ของ ชนิดของขอ มลู ท่ี array intro. to Java (FEU.faa)
เกบ็ int array num เก็บได

int [] num = new int[5];

ใช operator new ในการจองเนอื้ ที่ ชนิด
int จํานวน 5 ตัว

index ของ
array num

num[0] num[1] num[2] num[3] num[4]

num.length จะมคี าเทา กบั 5

ภาพที่ 4-1 การประกาศและกาํ หนดขนาดของ array

เม่ือมีการประกาศใช array เชน

int [] num;

นนั้ array ทเ่ี ราไดประกาศน้ันยังไมม ีเนอ้ื ทใ่ี นหนว ยความจาํ เลย เราตองกําหนดขนาดเพอ่ื ใหเ กิดการ
จองเนื้อทีใ่ นหนวยความจาํ ดวยการใช operator new รวมไปถึงจาํ นวนของเน้ือท่ที ่ีตอ งการใช เชน

int [] num = new int[5];

และทกุ คร้งั ของการจองเน้อื ที่ Java จะกําหนดใหข อ มูลในทุก ๆ ตาํ แหนงมคี า เปน 0 เสมอ

ในการเขา หาขอมูลแตล ะตัวนนั้ เรากเ็ พียงแตกาํ หนด index (ตวั ช้ีตาํ แหนง) ของขอมลู ท่เี ราตองการ
เขา หา เชน

num[3]
num[2]

เราไมส ามารถเขาหาขอมูล ณ ตําแหนง ทีม่ คี า index เกนิ 4 ไดท ั้งนเี้ พราะเรากําหนดให array num
มีความจุสงู สดุ เทากบั 5 ดงั นน้ั คา ของ index ท่ีเปนไปได คือ 0 1 2 3 และ 4 ถา หากวา เราเขา หา
ขอมูลทไี่ มอยูในตาํ แหนงทีก่ ลา วน้ี Java จะฟองดว ย error ทันทีวา index ที่เราอางถงึ ไมมีตัวตน
(array index out of bound)

4.2 การกาํ หนดคาเบือ้ งตน ใหก บั array

เรารวู าหลงั จากการประกาศและจองเนอื้ ที่ใหกับ array นน้ั ถา เปน array ท่เี ก็บ int ทกุ ๆ
หนวยความจาํ ของ array จะมคี าเปน 0 ดงั ทีแ่ สดงในโปรแกรมตัวอยา งนี้

118

บทท่ี 4: Array และ String

1: /** intro. to Java (FEU.faa)

2: Using array to store integers

3: */

4:

5: import static java.lang.System.out;

6:

7: class Array1 {

8: public static void main(String[] args) {
9: int[] list; //declare array of int

10:

11: //allocate space for 10 ints

12: list = new int[10];

13: for(int i = 0; i < list.length; i++)

14: out.println("list[" + i +"] = " + list[i]);

15: }

16: }

โปรแกรม Array1.java ประกาศใหตวั แปร list เปน array ทเ่ี กบ็ int เปน จํานวนเทากบั 10 ตวั เม่ือ
ประกาศเสร็จแลว เราก็ใช for/loop ในการเขาหาขอมูลในแตล ะตัว array โดยแสดงถึงคา ท่ี Java
กําหนดใหก ับ array ของเราไปยังหนาจอ ซ่ึงมคี า ดงั นี้

list[0] = 0
list[1] = 0

list[2] = 0
list[3] = 0

list[4] = 0
list[5] = 0

list[6] = 0

list[7] = 0
list[8] = 0
list[9] = 0

ดังเชนท่เี ราไดพดู ไวใ นบทที่ 3 ใน Java 1.5 เราสามารถท่ีจะใช for-in/loop แสดงขอมลู ใหเ ราดังนี้

1: /**

2: Using array to store integers
3: */

4:
5: import static java.lang.System.out;
6:

7: class ArrayForInLoop {
8: public static void main(String[] args) {
9: int[] list;//declare array of ints

10: int i = 0; //loop index

11:
12: //allocate space for 10 ints

13: list = new int[10];

14: for(int item : list)
15: out.printf("list[%d] = %d%n", i++, item);
16: }
17: }

จากโปรแกรมตวั อยา งที่เหน็ เราสามารถแสดงขอ มูลทุกตวั ของ array ดวยการใช for-in/loop ได
เชนเดยี วกับการใช for/loop แตเราไมส ามารถเขา หา index ของ array ได ซงึ่ ทําใหเ ราตอ งใชตวั
แปรอ่ืนชวยในการแสดงผล (ใหเหมือนกบั ท่ีทาํ ในโปรแกรม Array1.java)

การใช loop เปนวิธกี ารท่ีงา ยทส่ี ดุ ในการเขา หาขอ มูลทุกตวั ทอี่ ยูใ น array ยกเวน วาเรารูต าํ แหนง ที่
แนนอนของขอมลู ทีเ่ ราตอ งการใน array นน้ั เชน ตาํ แหนงท่ี 5 หรือตาํ แหนง ท่ี 3 เราก็เขา หาได
โดยตรง ดงั น้ี list[5] หรอื list[3] เปน ตน

array ทสี่ รา งข้ึนใน Java นน้ั เราสามารถทจ่ี ะดึงเอาขนาดของ array ออกมาไดด ว ยการเรยี กใช
คา คงท่ี ท่ีไดถ กู สรา งข้ึนหลงั จากการประกาศและจองเนื้อที่ใหก ับ array ดงั น้ี

list.length;

119

เรม่ิ ตนการเขยี นโปรแกรมดวย Java

ทกุ array ที่ไดถกู สรางขน้ึ จะมีขนาดของ array เกบ็ ไวในตัวแปรช่อื length และเราเรยี กขนาด intro. to Java (FEU.faa)
ออกมาไดผ านทางชอื่ ของ array ตามดว ย . และตวั แปร length

เรามาลองกําหนดคา ในตาํ แหนงตาง ๆ ใหก ับ array ของเรา

1: /**

2: Assign some values to array of ints
3: */

4:

5: import static java.lang.System.out;

6:

7: class Array2 {

8: public static void main(String[] args) {

9: int[] list; //declare array of int

10:
11: //allocate space for 10 ints

12: //assign values at index 5, 3, and 9

13: list = new int[10];
14: list[5] = 8;

15: list[3] = 2;

16: list[9] = 4;

17: for(int i = 0; i < list.length; i++)

18: out.println("list[" + i +"] = " + list[i]);

19: }

20: }

ผลลพั ธท ่ไี ดจากการ run คอื

list[0] = 0

list[1] = 0
list[2] = 0

list[3] = 2

list[4] = 0
list[5] = 8
list[6] = 0

list[7] = 0
list[8] = 0
list[9] = 4

เราสามารถทจี่ ะกําหนดคา ใหก บั array โดยทไี่ มต อ งกําหนดขนาดใหก บั array โดยตรง แตใ ห Java
จัดการเก่ยี วกับเรอ่ื งเน้ือที่ใหเรา ดังโปรแกรมตวั อยางตอ ไปน้ี

1: /**
2: Declare and assign values to array of ints

3: */
4:

5: import static java.lang.System.out;
6:

7: class Array3 {

8: public static void main(String[] args) {
9: //array of ints with initial values

10: int[] list = {2, 3, 1, 56, 90};

11: int i = 0;
12:
13: for(int item : list)

14: out.printf("list[%d] = %d%n", i++, item);
15: }

16: }

เรากําหนดให list เปน array ทีเ่ กบ็ int และกาํ หนดคา เบื้องตน เปน 2 3 1 56 และ 90 ตามลาํ ดบั
เม่ือ Java เห็นการประกาศในลักษณะน้ีก็จะทําการจองเนือ้ ที่ใหกบั array โดยอัตโนมตั ิพรอ มทงั้ นํา
คา ตา ง ๆ ทไ่ี ดถ กู กําหนดจาก user ไปใสไวใน array list และเม่ือ run ดูเราก็ไดผลลัพธด งั ท่เี ห็นน้ี

list[0] = 2

list[1] = 3
list[2] = 1
list[3] = 56

list[4] = 90

120

บทท่ี 4: Array และ String

โปรแกรมตวั อยา งตอ ไปนแ้ี สดงถงึ การเก็บขอมูลที่ user ใสเ ขา มาจาก keyboard เขาสู array (เรา intro. to Java (FEU.faa)
ยงั คงใชว ธิ ีการแบบเดมิ กอ น Java 1.5 ในการรบั ขอมูล)

1: /**
2: Get numbers from keyboard and keep them in array

3: */

4:

5: import static java.lang.System.out;

6: import java.io.BufferedReader;

7: import java.io.InputStreamReader;

8: import java.io.IOException;

9:
10:

11: class ArrayOfNumbers {

12: public static void main(String[] args) throws IOException {

13: double number, sum = 0; //a number and sum

14: double[] list; //array of double

15: int count; //number of items

16: String input; //input string

17: BufferedReader buffer; //input buffer

18: InputStreamReader isr; //input stream

19:

20: out.print("How many numbers? : ");
21: isr = new InputStreamReader(System.in);

22: buffer = new BufferedReader(isr);

23: input = buffer.readLine();

24:

25: count = Integer.parseInt(input); //total items in list

26: list = new double[count]; //allocate space for list

27: //reading each double into list

28: for(int i = 0; i < list.length; i++) {
29: out.print("Enter number: ");

30: input = buffer.readLine();

31: list[i] = Double.parseDouble(input);
32: }

33:

34: //add all doubles in list

35: int n = list.length - 1; //n is the last index of list

36: while(n >= 0) { //looping until n equals to 0

37: sum += list[n--]; //add list[n] into sum and

38: } //decrement n

39:

40: //calculate average and display result

41: double average = sum / count;

42: out.printf("Sum of numbers = %.2f%n", sum);

43: out.printf("Average of numbers = %.2f%n", average);

44: }

45: }

โปรแกรม ArrayOfNumbers.java ถาม user ถึงจาํ นวนของขอ มลู สูงสุดท่ี user จะใสเขาสูโปรแกรม
ซ่งึ เม่อื ไดแ ลวโปรแกรมจะใชจํานวนที่อานไดเ ปน ตวั กําหนดขนาดใหก บั array

list = new double[count];

หลงั จากนนั้ กจ็ ะอานขอ มูลทีละตัวจาก user นําไปเก็บไวใ น array list

for(int i = 0; i < list.length; i++) {

out.print("Enter number: ");
input = buffer.readLine();
list[i] = Double.parseDouble(input);

}

ในขณะทอ่ี านขอมลู เขา สู array นน้ั เราอาจหาผลรวมของเลขทุกตวั พรอม ๆ กนั ไปดว ยก็ได แตท ่ี
โปรแกรมนแี้ ยกการหาผลรวมก็เพ่อื ท่ีจะแสดงใหเ หน็ ถงึ การใช loop ในการเขา หา array อกี ครง้ั หนึ่ง
โดยเรากําหนดใหต วั แปร n เปน index ตวั สดุ ทา ยของ array list ดว ยประโยค

int n = list.length - 1;

121

เริม่ ตน การเขยี นโปรแกรมดว ย Java

เราตองไมลืมวา list.length ใหจ ํานวนของขอ มลู ท้ังหมดทอ่ี ยูใ น array ดงั น้นั index ตวั สดุ ทา ยก็คือ intro. to Java (FEU.faa)
list.length – 1 หลงั จากนัน้ เราจะใช while loop เปนตวั เขาหาขอมลู ใน array แตล ะตวั จากขา งหลัง
และบวกขอมลู ทุก ๆ ตัวเขา กับตัวแปร sum

while(n >= 0) {
sum += list[n--];

}

ประโยค sum += list[n--] นัน้ จะบวกขอมูลในตาํ แหนง n เขา กับตัวแปร sum กอ นท่ีจะลดคาของ n
ลงหน่งึ คา และเมอ่ื คา n นอยกวา 0 เราก็หลดุ ออกจาก while loop ทันที

ผลลัพธทเ่ี ราไดจ ากการ run โปรแกรม ArrayOfNumbers.java ดว ยขอมูลดง ทเี่ ห็น คือ

How many numbers? : 5
Enter number: 12

Enter number: 31

Enter number: 56
Enter number: 81
Enter number: 2
Sum of numbers = 182.00

Average of numbers = 36.40

โปรแกรมตัวอยา งถดั ไปเปน โปรแกรมที่ดัดแปลงจาก ArrayOfNumbers.java โดยให user ใสข อมูล
ผา น Dialog Box และแสดงผลลัพธอ อกทาง Dialog Box เชนเดียวกนั อกี ท้ังยงั ใช StringTokenizer
ในการดงึ ขอมลู ท่ี User ใสใน Dialog Box ซงึ่ ก็คลายๆ กับการใช StreamTokenizer ทเ่ี ราใชใน
โปรแกรม ArrayOfNumbers.java

1: /**

2: Using JOptionPane for I/O

3: */

4:

5: import java.io.*;

6: import java.util.StringTokenizer;

7: import javax.swing.JOptionPane;

8:

9: class ArrayOfNumbersSW {
10: public static void main(String[] args) throws IOException {

11: double number, sum = 0; //a number and sum

12: double[] list; //array of double

13: int count; //number of items

14: String input; //input string

15:

16: input = JOptionPane.showInputDialog(null,

17: "Enter numbers - separate by space",

18: "Array Example", JOptionPane.QUESTION_MESSAGE);

19:

20: StringTokenizer s = new StringTokenizer(input);
21: count = s.countTokens();

22: list = new double[count]; //allocate space for list

23:

24: //extract numbers from s into list

25: int i = 0;

26: while(s.hasMoreTokens()) {

27: list[i++] = Double.parseDouble(s.nextToken());

28: }
29:

30: //add all doubles in list

31: for(Double num : list) {

32: sum += num;

33: }

34:

35: //calculate average and display result

36: double average = sum / count;

37: JOptionPane.showMessageDialog(null, "Sum = " +

38: sum + ", Average = " +

39: String.format("%.2f", average),
40: "Output", JOptionPane.INFORMATION_MESSAGE);

41: }

42: }

122

บทที่ 4: Array และ String

ผลลพั ธของการ run คือ intro. to Java (FEU.faa)

กอนท่เี ราจะดึงขอ มูลออกจาก StringTokenizer นัน้ เราตอ งทาํ การจองเนอื้ ทใ่ี หกบั list กอ น ซึ่ง
วิธกี ารทีเ่ ราเลอื กใชก็คือ การใช method countTokens() เปน ตัวดงึ จาํ นวนของขอมูลท่มี อี ยใู น
String s ไปเก็บไวใ นตัวแปร count หลังจากนนั้ ก็ใช count จองเน้ือที่ใหกับ list เพอ่ื เก็บขอมลู
ตอไป (บรรทัดที่ 21 – 22)

สําหรับการดงึ ขอมูลจาก String s นัน้ เรากใ็ ช method nextToken() และ method
hasMoreTokens() เปนตัวดึงใหเ รา

int i = 0;
while(s.hasMoreTokens()){

list[i++] = Double.parseDouble(s.nextToken());
}

Loop จะทํางานถา method hasMoreToken() สงคาท่เี ปนจริงกลับออกมา พดู ภาษาชาวบานก็คอื s
ยงั มี token อยู และ nextToken() จะสงคา ของ token ท่เี ปน String กลบั ออกมา เราตอ งทําการ
เปลี่ยน String ตวั น้ใี หเ ปน double กอนทจ่ี ะนาํ ไปเกบ็ ไวใ น list อยา งไรก็ตามโปรแกรมตวั อยางของ
เราไมมกี ารตรวจสอบขอผิดพลาดท่ีอาจเกดิ ขน้ึ จากการใสขอมูล เชน ถา user ใสข อมลู ทไ่ี มใช
double โปรแกรมกจ็ ะฟองทันที

ในการหาผลรวมของตัวเลขนน้ั เรากใ็ ช for-in/loop เปนตวั ดงึ เอาขอมูลทีม่ อี ยใู น list ออกมารวมกนั
เพือ่ นําไปเกบ็ ไวในตวั แปร sum ตอไปดังท่แี สดงใหด ใู นบรรทดั ท่ี 31 – 32 สวนการแสดงผลเราก็ใช
format() ของ class String เปน ตวั กาํ หนดตาํ แหนง ทศนยิ มที่ตอ งการแสดง

4.3 การอา งถงึ array ดวยการ clone และการ copy array

เมื่อเราสราง array ขน้ึ มาแลว เราสามารถที่จะอางถึงตัวแปรตวั น้ีดว ยตวั แปรอน่ื ก็ได แตไ มได
หมายความวา เราไดสราง array ตัวใหมจากตวั แปรตัวใหมนี้ เราเพยี งแตใชตวั แปรตวั ใหมใ นการอา ง
ถงึ array ตัวเดมิ เพราะฉะน้ันการกระทาํ ใด ๆ ผานตวั แปรตวั ใหมก จ็ ะมีผลกระทบกับขอมลู ใน array
ตวั เดมิ น้นั ดังโปรแกรมตวั อยางนี้

1: /**
2: Cloning array
3: */
4:
5: import static java.lang.System.out;
6:

123

เริ่มตนการเขียนโปรแกรมดวย Java

7: class Array4 {

8: public static void main(String[] args) {

9: int[] list = {2, 3, 1, 56, 90}; intro. to Java (FEU.faa)

10:

11: //print list to screen

12: out.println("Before cloning");

13: for(int i = 0; i < list.length; i++)

14: out.println("list[" + i +"] = " + list[i]);

15:

16: int[] newList = list; //cloning

17: newList[0] = 11; //changing data at list[0]

18: newList[3] = 1234; //changing data at list[3]

19:

20: out.println("After cloning");

21: int i = 0;

22: for(int item : list)

23: out.printf("list[%d] = %d%n", i++, item);

24: }

25: }

เราไดดดั แปลงโปรแกรม Array3.java ใหม กี ารอางถึง (reference) array list ดวยตวั แปรตัวใหมท่ี
ชอ่ื newList

int[] newList = list;

และเรากไ็ ดท ําการเปลย่ี นขอมลู ณ ตาํ แหนง 0 ใหเ ปน 11 และขอมูลในตาํ แหนง 3 ใหเ ปน 1234
ผานทาง newList เมื่อลอง run ดเู รากจ็ ะไดผลลพั ธด งั น้ี

Before cloning

list[0] = 2
list[1] = 3

list[2] = 1

list[3] = 56
list[4] = 90
After cloning

list[0] = 11
list[1] = 3
list[2] = 1

list[3] = 1234
list[4] = 90

สวนวธิ ีการ copy ขอมลู จาก array ตวั หน่งึ ไปยัง array อีกตัวหนง่ึ นั้นมีวธิ ีการอยูส ามวธิ ที ่ที ําได วิธที ่ี
หน่ึงน้ันเราตองสรา ง array ใหมขึ้นมาแลวก็ copy ขอมลู ทุกตวั จาก array ตวั เดมิ เขาสู array ตัวใหม
ดงั น้ี

1: /**

2: Copy from one array to another

3: */

4:

5: import static java.lang.System.out;

6:

7: class Array5 {
8: public static void main(String[] args) {

9: int[] list = {2, 3, 1, 56, 90}; //original array

10: int[] newList = new int[list.length]; //new array
11:

12: //copy each item from list into newList

13: for(int i = 0; i < list.length; i++)

14: newList[i] = list[i];

15:

16: for(int i = 0; i < list.length; i++)

17: out.println("newList[" + i +"] = " + newList[i]);

18: }
19: }

โปรแกรม Array5.java สราง newList ดวยคาํ ส่ัง

int[] newList = new int[list.length];

124

บทท่ี 4: Array และ String

เรากาํ หนดขนาดของ newList ดวยขนาดที่มาจาก list หลังจากนัน้ เราก็ copy ขอ มูลทุกตวั ดว ยการ intro. to Java (FEU.faa)
ใช for/loop

for(int i = 0; i < list.length; i++)
newList[i] = list[i];

และเม่ือ run ดเู ราก็ไดผลลพั ธด ังทีค่ าดไว คอื

newList[0] = 2
newList[1] = 3

newList[2] = 1
newList[3] = 56
newList[4] = 90

สําหรับวธิ ีทส่ี องนนั้ เราจะใช method arraycopy() ของ Java เปนตัวคดั ลอกขอมูลจาก array ตัว
หน่งึ ไปยังอกี ตวั หนง่ึ ดงั ที่แสดงใหดูน้ี

1: /**

2: Using system's arraycopy to create new array

3: */

4:

5: import static java.lang.System.out;

6:

7: class Array6 {

8: public static void main(String[] args) { //original array
9: int[] list = {2, 3, 1, 56, 90};

10: int[] newList = new int[list.length]; //new array

11:

12: //copy each item from list into newList

13: System.arraycopy(list, 0, newList, 0, list.length);

14:

15: for(int i = 0; i < list.length; i++)

16: out.println("newList[" + i +"] = " + newList[i]);
17: }

18: }

ถงึ แมว าเรายงั ไมไ ดพดู ถงึ เรอ่ื งของ class หรอื method แตเราก็ตอ งมาทาํ ความเขา ใจถงึ การเรียกใช
method ท่ี Java มีให เพราะวาวิธีทสี่ องนี้เราใช method arraycopy() ทําการสรา งและ copy ขอมูล
ให ตอนนเ้ี ราคงตองจาํ วธิ กี ารเรียกใชมากกวา การทําความเขาใจอยา งละเอียด (ซ่งึ เราจะพูดถึงในบท
ตอ ๆ ไป) เรา copy ดวยการใชค าํ ส่งั

System.arraycopy(list, 0, newList, 0, list.length);

โดยเราตอ งใสขอ มลู หรอื เง่ือนไข (parameter) ตามท่ี Java กาํ หนดไวค อื

ตวั แรกเปน array ตัวเดมิ ทต่ี อ งการ copy (list)
ตวั ที่สองเปน index เริม่ ตน ของ array ตัวเดมิ (0)
ตวั ท่ีสามเปน array ตวั ใหมท ต่ี องการสรา ง (newList)
ตัวท่ีสเี่ ปน index เริม่ ตน ของ array ตวั ใหม (0)
ตัวที่หา เปน จาํ นวนของขอ มูลท่ีตองการ copy (list.length)

วิธีท่ีสามก็คลา ย ๆ กบั วธิ ที ส่ี องเพียงแตเ ราเรียกใช method clone() แทน ซ่ึงทําไดด ังน้ี

1: /**

2: Cloning array with method clone()

3: */
4:

5: import static java.lang.System.out;

6:

7: class Array7 {

8: public static void main(String[] args) {

9: int[] list = {2, 3, 1, 56, 90}; //original array

10:

11: //cloning process

12: int[] newList = (int[])list.clone();

13:

125

เรม่ิ ตน การเขยี นโปรแกรมดว ย Java

14: int i = 0; intro. to Java (FEU.faa)

15: for(int item : newList)
16: out.printf("newList[%d] = %d%n", i++, item);

17: }
18: }

เราเพียงแตเรียกใช method clone() ดงั ท่ีเหน็ ในโปรแกรม Array7.java เราก็สามารถท่จี ะมี array
ตวั ใหมสาํ หรับการใชงาน ดวยประโยค

int[] newList = (int[])list.clone();

เราจําเปน ทีจ่ ะตอ งทาํ การ cast ใหก บั array ของเราเสยี กอนเพือ่ ใหชนดิ ของ array ที่ถูก clone
ขึ้นมานัน้ เปนชนิดเดยี วกัน ซ่งึ ทําไดด ว ยการนาํ เอา (int[]) ไปใสไวห นาประโยค list.clone() ทั้งน้ี
ตอ งกาํ หนดชอื่ array ตัวเดมิ ใหถกู ตอง (list) เพ่อื ไมใหเกิดการผิดพลาดใด ๆ

วิธที ีส่ ามท่ไี ดกลา วไวจ ะ copy ขอ มูลใน array เดมิ ทม่ี ีอยูท ง้ั หมดไปเก็บไวใน array ตัวใหม ดังนัน้
ถา หากวาเราตอ งการที่จะสรา ง array ใหมจากขอ มลู บางสวนของ array ตวั เดมิ เราก็ตองใชวิธีทส่ี อง
ดังตวั อยา งน้ี

1: /**

2: Copy part of one array to another

3: */

4:

5: import static java.lang.System.out;

6:

7: class Array8 {
8: public static void main(String[] args) {

9: int[] list = {2, 3, 1, 56, 90}; //original array

10: int[] newList = new int[list.length-2];//new array

11:

12: //copy item at index 2, 3, and 4 from list into newList

13: System.arraycopy(list, 2, newList, 0, list.length - 2);

14:

15: int i = 0;

16: for(int item : newList)

17: out.printf("newList[%d] = %d%n", i++, item);

18: }
19: }

โปรแกรม Array8.java ของเราตอ งการท่ีจะ copy ขอ มูล ณ ตาํ แหนง ท่ี 2 3 และ 4 จาก array list
เขา สู array newList ในตําแหนง 0 1 และ 2 ตามลําดบั เพราะฉะน้นั เราตองเรียกใช method
arraycopy() ดังนี้

System.arraycopy(list, 2, newList, 0, list.length – 2);

ผลลัพธข องการ run คือ

newList[0] = 1
newList[1] = 56
newList[2] = 90

4.4 การใช array แบบยดื หยุน (Dynamic Array)

เราสามารถท่ีจะใชเ ทคนิคทเี่ ราพดู มากอนหนา นี้ในการสราง array แบบไมจ าํ กดั จาํ นวนของขอมลู ท่ี
สามารถจัดเกบ็ ไดใ น array น้ัน ๆ เราเรียกการจดั เก็บแบบน้ีวาการจัดเก็บแบบยดื หยุน แตก อนท่ีเราจะ
สรา งไดน ั้นเราตอ งกาํ หนดให array เร่มิ ตน ของเรามีขนาดเบือ้ งตน กอน หลงั จากนั้นจึงจะสามารถ
ขยายขนาดของ array ได ดังโปรแกรมตัวอยา งท่ีไดด ัดแปลงมาจากโปรแกรม AddNumbers.java
ทเี่ ขยี นข้นึ กอ นหนาน้ี

1: /**
2: Expand size of array when needed

3: */
4:

5: import javax.swing.JOptionPane;
6:
7: class DynamicArray {

8: public static void main(String[] args) {

126

บทท่ี 4: Array และ String

9: double number, sum = 0; //a number and sum

10: double []list = new double[2]; //array of double

11: String input; //input string intro. to Java (FEU.faa)

12:

13: //get input from user (seperate by space)

14: input = JOptionPane.showInputDialog("Enter numbers: ");

15: String[] tokens = input.split("\\s");

16:

17: int count = 0;

18: while(count < tokens.length) {

19: number = Integer.parseInt(tokens[count]);

20: if(count > list.length-1) {

21: double []newList = new double[list.length*2];

22: System.arraycopy(list, 0, newList, 0, list.length);

23: list = newList; //point to new list

24: }

25: list[count] = number; //save token to list

26: sum += list[count]; //calculate sum

27: count++; //number of tokens read
28: }

29:

30: //calculate average and display result

31: double average = sum / count;

32: JOptionPane.showMessageDialog(null,

33: "Sum of numbers: " + input + " is " +

34: String.format("%.2f%n", sum) +

35: "Average of numbers: " +

36: String.format("%.2f", average),

37: "Sum and Average",

38: JOptionPane.INFORMATION_MESSAGE);
39: }

40: }

เราประกาศตวั แปร list ใหเ ปน array ท่ีเก็บ double เรมิ่ ตนดวยจาํ นวนเทากับ 2ตวั และในการนาํ
ขอ มลู เขา สู array นน้ั เราจะตรวจสอบดูวาจํานวนของ index ทีเ่ ราใชในการเขาหาขอ มูลแตล ะตวั มีคา
เกินจาํ นวนของขอ มลู ทเี่ ปน อยูขณะนั้นหรอื ไม ซง่ึ ถา เปน จรงิ เราก็จะทาํ การขยายขนาดใหกับ array
list เปนจํานวนสองเทา ของขนาดเดิม และทําการ copy ขอมูลจาก array list ไปสู array ใหมนี้
(newList) หลังจากน้ันเราก็อา งถงึ array ตวั ใหมน้ดี วยตวั แปรเดิมที่เราใชในการเกบ็ ขอมลู ครง้ั แรก
(list) เราไมตองกงั วลถงึ หนวยความจาํ ท่ีเราไดใ ชไปในการสรา ง array ตัวเดิมเพราะ Java จะทําการ
ตรวจสอบถงึ หนว ยความจาํ ที่ไมม ีการใชงาน และจะคืนหนว ยความจําน้ใี หกบั ระบบโดยอตั โนมัติ

if(count > list.length-1) {
double []newList = new double[list.length*2];
System.arraycopy(list, 0, newList, 0, list.length);

list = newList;

}

วธิ กี ารขยายขนาดของ array แบบน้ที ําใหเราไมตองกําหนดขนาดของ array ใหม ีขนาดใหญ
มากมายเกนิ ไปตอนทเ่ี ราสราง array ในครัง้ แรก เราสนใจเฉพาะเม่อื จําเปนตอ งขยายขนาดของ
array จริง ๆ เทานั้น ผูอานอาจเปลีย่ นแปลงการขยายขนาดของ array ดวยการเพ่มิ ทลี ะก่ีตวั กไ็ ด
ทง้ั นกี้ ็ขนึ้ อยกู บั ความจําเปนและเหมาะสมกบั งานน้ัน ๆ

ผลลัพธของการ run โปรแกรม DynamicArray.java ก็คลา ย ๆ กบั ผลลพั ธของโปรแกรม
AddNumbers.java ท่ีเราไดเขียนไวกอนหนา นี้

หลายๆคร้งั ทีเ่ ราตองเขียนโปรแกรมสําหรบั การนบั จาํ นวนครงั้ ของเหตุการณหรือ จํานวนคร้ังของ
ขอมูลทเ่ี กดิ ขน้ึ เชนจาํ นวนครั้งของคะแนนที่นักศกึ ษาไดในการสอบแตละครั้ง โปรแกรมตวั อยางการ
ใช array และ indexของ array ในการนับจํานวนคร้ังของลกู เตา ทอ่ี อกซ้ํากันจากการโยนหลาย ๆ
คร้งั

1: /**
2: Frequency of faces of a die
3: */

4:
5: import javax.swing.JOptionPane;
6:

7: class DiceRolling {

127

เริม่ ตน การเขยี นโปรแกรมดวย Java

8: public static void main(String[] args) { intro. to Java (FEU.faa)
int face, roll;
9: int[] frequency = new int[7];
10:
//rolling a die for 100 times
11: roll = 1;
12: while(roll <= 100) {
13:
//roll a die
14: face = (int)(Math.random() * 6) + 1;
15: //save each time the same face occur by using
16: //indexes as faces of die
frequency[face]++;
17: roll++;
18: }

19: //store frequencies in result for displaying
20: String output;
21: String result = "";
int total = 0;
22: for(int i = 1; i < frequency.length; i++) {
23:
24: output = String.format("%2d%18c%2d%n", i, ' ', frequency[i]);
total += frequency[i];
25: result += output;
}
26:
27: //display result
String header = String.format("Face%8cFrequency%n", ' ');
28: JOptionPane.showMessageDialog(null,
29:
header + result + "\nTotal: " +
30: total,
31: "Rolling a die 100 times",
32: JOptionPane.INFORMATION_MESSAGE);

33: System.exit(0);
34: }
35:

36:

37:
38:

39:

40:
41:
42:
43: }

โปรแกรม DiceRolling.java ใชตัว index ของ array เปน หนา ของลูกเตา ทีถ่ กู โยนโดยการใชการสมุ
ผานทาง method random() ซ่ึงจะบังคับใหผลลพั ธของการโยนน้ันอยรู ะหวาง 1 – 6 ดวยการคูณ 6
เขา กบั ผลลัพธท ไี่ ดจากการสุม บวกเขากับ 1 การนับจํานวนครงั้ กท็ าํ ไดด ว ยการเพม่ิ คา ใหก ับขอมลู ที่
index นนั้ ๆ ของลกู เตา เชน ถาการโยนไดคา เทา กบั 6 เราก็เพ่มิ คา ดวย frequency[6]++ ซึ่งจะทํา
ใหคาท่ีอยู ณ ตําแหนง นน้ั เพม่ิ ข้ึนอีกหน่ึงคา วธิ กี ารใช index ของ array ในลกั ษณะนี้ชวยลดข้นั ตอน
การนบั จาํ นวนของหนาลูกเตา ท่ีเกิดขน้ึ ไดด ีกวาวิธอี ื่น ๆ เชน การใช if – else มาชวยในการ
ตรวจสอบวา การโยนใหคา อะไร แลว จึงเพ่ิมคาใหก บั ตวั แปรทเ่ี ก็บการนับของหนานน้ั ๆ

if(face == 1)
count1++;

else if(face == 2)
count2++;

else if(face == 3)
count3++;




else if(face == 6)
count6++;

ซ่ึงเปน วิธีท่ตี องเขียน code มากกวา และใชต ัวแปรเยอะกวา การใช frequency[face]++

ผลลัพธข องการ run

128

บทท่ี 4: Array และ String intro. to Java (FEU.faa)

for/loop ในบรรทดั ท่ี 27 – 30 เปนกระบวนการเตรียมขอ มูลสาํ หรบั การแสดงผลผา นทาง dialog
box เราตอ งการที่จะแสดงผลในรปู แบบของ row/column ทมี่ ีคา ของลูกเตา และจาํ นวนครงั้ ทเี่ กดิ ข้นึ
ของการโยนทงั้ หมด และเน่ืองจากวา เราตองเปลย่ี นขอ มลู ใหอ ยใู นรปู แบบของ String กอนทีจ่ ะสงไป
ยงั dialog box เราจงึ ตองใช method format() จัดการกับขอ มลู ทเี่ รามอี ยใู น array frequencies
ดงั น้ี

output = String.format("%2d%18c%2d%n", i, ' ', frequency[i]);

เรากาํ หนดให output มขี อ มลู ในรูปแบบทีไ่ ดกาํ หนดไวใน method format() คอื แสดงคา ของ
ลูกเตาในหน่ึงหนา ตามดว ยชองวาง ตามดวยจํานวนครงั้ ทเ่ี กิดข้ึน และสุดทายตามดว ยการขนึ้ บรรทดั
ใหม (new line character: %n หรือ \n) เม่ือเราไดข อมูลในหนง่ึ หนาแลว เรากเ็ กบ็ คาใน output ไว
ในตวั แปร result เพือ่ นาํ ไปแสดงใน dialog box ตอไป
4.5 การคนหาขอมลู ใน array (Searching)
การคนหาขอมลู ใน array นนั้ ทาํ ไดอยูสองวิธใี หญ ๆ คือ การคนหาแบบตามลําดับ (sequential
search) และ การคนหาแบบหารสอง (binary search) เราจะมาดูถึงวิธีการคน หาแบบตามลาํ ดับกอน
เพราะเปนการคนหาท่งี ายทีส่ ุด
4.5.1 การคนหาแบบตามลําดับ (Sequential search)
ในการคน หาแบบนี้นัน้ เราจะเร่ิมตนจากขอมลู ตัวแรกสดุ 1ทอ่ี ยใู น array ทําการเปรียบเทยี บขอ มูลตวั นี้
กับขอมลู ที่ตองการคน หาวาเปน ตัวเดียวกนั หรือไม ถา ใชเราก็หยดุ การคนหา ถา เราคนไปจนถงึ ตวั
สุดทายแตก ย็ งั ไมใ ช เราก็รูวา ขอมลู ท่ตี องการคนหาไมไ ดอ ยูใ น array ลองดโู ปรแกรมตวั อยางกัน

1: /**
2: Searching for an item in array
3: using sequential search (linear search)
4: */
5:
6: import javax.swing.JOptionPane;
7:
8: class SeqSearch {
9: public static void main(String[] args) {
10: int[] list = {2, 3, 1, 56, 90};
11: String input;
12: int number;
13:
14: //get input from user
15: input = JOptionPane.showInputDialog("What number? ");
16: number = Integer.parseInt(input);
17:
18: //search for number in the list
19: //comparing number against item in the list
20: //one by one until found or out of item in the list

1 หรืออาจเริ่มจากทางดานหลังของ array ก็ได

129

เร่มิ ตน การเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)

21: boolean found = false;
22: for(int item : list) {
23: //if number is in the list, break out of loop
24: if(number == item) {
25: found = true;
26: break;
27: }
28: }
29:
30: String result = "";
31: if(!found)
32: result += number + " is not in the list.";
33: else
34: result += "Found " + number + " in the list";
35:
36: //display result
37: JOptionPane.showMessageDialog(null,
38: result, "Sequential search",
39: JOptionPane.INFORMATION_MESSAGE);
40:
41: System.exit(0);
42: }
43: }

เราใช for-in/loop ในการเขาหาขอมูลทุกตวั ทอี่ ยูใน array list โดยเรากาํ หนดใหต วั แปร found ซึ่งมี
ชนิดเปน boolean เปนตวั ควบคมุ การทาํ งานของ loop ซึง่ ถาการคนหาประสพผลสําเร็จ ตัวแปร
found กจ็ ะถูกกาํ หนดใหเ ปน true และ loop ของเราก็จะยุติการทาํ งานทันที หลังจากน้นั เราก็
แสดงผลของการคนหาไปยงั หนา จอ ดงั ตัวอยา งทแี่ สดงผลลัพธของการคนหาที่เห็นน้ี

การคน หาแบบนไ้ี มค อ ยนิยมใชก นั มากเทาไร ทง้ั นีก้ ็เพราะวาจะใชเวลาในการคนหามาก ถา ขอ มลู ท่ี
ตองการคน หาอยูดา นหลังสุดของ array ยิ่งถา array เก็บขอมูลไวเ ยอะการคนหาก็จะใชเวลามาก
ยงิ่ ข้นึ

4.5.2 การคนหาแบบไบนารี (Binary search)

การคนหาในรูปแบบของ binary search จะทําการแบง ขอมลู ทงั้ หมดออกเปนสองสวนทกุ ครง้ั ทม่ี ีการ
เปรยี บเทียบขอมลู ทตี่ องการคนหา (key) การคน หาเริ่มตน ดว ยการเปรยี บเทยี บ key กบั ขอ มูล ณ
ตาํ แหนง ทีอ่ ยูกง่ึ กลางของ array ถา key มีคา นอ ยกวา ขอ มลู ณ ตําแหนง นีก้ ารคน หาก็ยา ยไปคน
ทางซายของขอ มูลน้ี และจะคนทางขวาถา key มีคามากกวา ขอ มลู ที่ตําแหนงน้ี การคน หาจะดําเนิน
ไปจนกวาจะคนพบ นั่นก็คอื key มคี าเทากบั ขอ มูลท่ีตําแหนงนั้น หรอื ไมก ย็ ตุ ิการคนถา ไมมีขอมูลน้นั
ใน array

ส่ิงที่สาํ คัญในการคนหาแบบนกี้ ็คือ ขอมูลจะตองมกี ารจดั เก็บแบบจัดเรยี งจากนอยไปหามาก เพราะ
ถาไมอ ยูใ นรูปแบบนแ้ี ลวการคน หาก็จะทาํ ไมได

วิธีการคนหาดวย binary search จะลดจํานวนครั้งของการเปรยี บเทียบลงไปทลี ะคร่ึง ทาํ ใหการ
คน หาใชเ วลานอยลง ตัวอยา งเชน การคนหาใน array ท่ีมขี อมลู เทากบั 1024 ตวั จะใชก าร
เปรียบเทียบเพียง 10 ครัง้ ครง้ั แรกลดลงเหลอื 512 ครั้งท่สี องเหลือ 256 และครั้งตอ ๆ ไปเหลือ
128 64 32 16 8 4 2 และ 1 จะเห็นวาลดลงมาก ซงึ่ เปนจดุ แขง็ ของการคน หาของ binary search
โปรแกรม BinSearch.java แสดงการคน หาดว ยการใช binary search

1: /**

130

บทท่ี 4: Array และ String

2: Searching for an item using binary search

3: */

4: intro. to Java (FEU.faa)

5: import javax.swing.JOptionPane;

6:

7: class BinSearch {

8: public static void main(String[] args) {

9: int[] list = new int[1024];

10: int number;

11:

12: //populate array with random ints

13: for(int i = 0; i < 1024; i++) {

14: number = (int)(Math.random() * 1024 + 1);

15: list[i] = number;

16: }

17:

18: //get input from user

19: String input;

20: int key;
21: input = JOptionPane.showInputDialog("What number? ");

22: key = Integer.parseInt(input);

23:

24: int low = 0; //lower index

25: int high = list.length - 1; //upper index

26: int middle; //pivot

27: boolean found = false;

28:

29: while(low <= high) {

30: //find pivot

31: middle = (low + high) / 2;
32: //found key - exit the loop

33: if(key == list[middle]) {

34: found = true;

35: break;

36: }

37: //key is in lower half

38: else if(key < list[middle])

39: high = middle - 1;
40: //key is in upper half

41: else

42: low = middle + 1;
43: }

44:

45: String result = "";

46: if(!found)

47: result += key + " is not in the list.";

48: else

49: result += "Found " + key + " in the list";

50:
51: //display result

52: JOptionPane.showMessageDialog(null,

53: result, "Binary search",

54: JOptionPane.INFORMATION_MESSAGE);

55:

56: System.exit(0);

57: }

58: }

โปรแกรม BinSearch.java ของเราเรมิ่ ตนดวยการกาํ หนดให array list มขี อมลู เปนจาํ นวนเทากับ 10
ตวั และกาํ หนดใหขอมูลที่ตอ งการคน หา (key) มาจากการสุม หลังจากนัน้ กก็ ําหนดให index หวั
(low) และทา ย (high) ของ array เปน 0 และ list.length – 1 ตามลาํ ดบั เราจะใช while loop เปน
ตัวเขา หาขอ มูลใน array list ของเราดวยการเปรยี บเทียบคา ของ low กับ high ซึ่งถา เมื่อใดกต็ ามที่
คา ของ low มากกวาหรือเทากับ high กห็ มายความวาการคนหาของเราไมป ระสพผลสําเรจ็ คือไมมี
ขอ มูลนน้ั อยใู น list เราก็จะยตุ ิการทํางานทันที เราหาขอมูลทอ่ี ยตู รงกลางดว ย

middle = (low + high) / 2;

และเปรียบเทียบการคน หาที่ประสพผลสาํ เร็จดวยประโยค

if(key == list[middle]) {
found = true;

131

เร่ิมตน การเขียนโปรแกรมดว ย Java

break;
}

เราจะเปรียบเทียบและแบงขอมลู ออกเปน สองสว นดว ย intro. to Java (FEU.faa)

else if(key < list[middle])
high = middle - 1;

else
low = middle + 1;

เราจะยา ย index ท่อี ยหู ลังสดุ ใหเ ปน middle – 1 ถา ขอมูลที่เปน key นอ ยกวาขอมูลทอ่ี ยู ณ
ตาํ แหนง middle และจะยาย low ไปอยูท ่ี middle + 1 ถา key มคี ามากกวา ขอมูล ณ ตําแหนง
middle เราจะทําไปจนกวาจะเจอขอมูลท่ีตําแหนง middle หรอื ไมก ็หยดุ การทาํ งานโดยไมพ บขอมูล
ทตี่ อ งการคน หาเลย

4.6 การจัดเรยี งลําดับ (sort) ขอมูลใน array

มีวิธกี ารหลากหลายวธิ ีทส่ี ามารถนํามาใชใ นการจดั เรยี งขอ มลู ใน array แตเนือ่ งจากวาเรายังตอง
ศึกษาถงึ สวนประกอบอ่ืน ๆ ของ Java กอนท่ีเราจะนาํ เอาวิธีการเหลา น้นั มาใชไ ด ซ่ึงหนงั สือสว นมาก
กจ็ ะนําเอาวิธีการจัดเรียงขอมูลไปไวใ นวชิ าโครงสรางขอมูล ดังน้ันเราจะพูดถงึ เฉพาะการนาํ เอา
method การ sort ที่ Java มีใหมาใชโ ดยตรงเพอื่ ใหก ารทาํ งานเปน ไปไดร วดเร็วยง่ิ ขึน้

เราเพยี งแตสง array ท่เี ราตอ งการ sort ไปให method sort() ที่ Java มีให ดังนี้

Arrays.sort(list)

โดยท่ี list เปน array ที่เราตองการ sort โปรแกรม Sort.java แสดงวิธีการเรียกใช sort จาก class
Arrays

1: /**

2: Using sort routine from class Arrays

3: */

4:

5: import javax.swing.JOptionPane;
6: import java.util.Arrays;

7: import java.awt.Font;

8:

9: class Sort {

10: public static void main(String[] args) {

11: int[] list = new int[100]; //array with 100 ints

12: int i;

13:

14: //populate list with random ints

15: for(i = 0; i < 100; i++)

16: list[i] = (int)(Math.random() * 100 + 1);

17:

18: //display result

19: String output = "";

20: String result = "";

21: for(i = 0; i < list.length; i++) {

22: if(i != 0 && i % 10 == 0)

23: result += "\n";

24: else

25: output = String.format("%4d", list[i]);

26: result += output;

27: }

28: JOptionPane.showMessageDialog(null,

29: result, "Data before sorting",

30: JOptionPane.INFORMATION_MESSAGE);

31:

32: Arrays.sort(list); //calling sort from class Arrays

33:

34: //display again

35: output = "";

36: result = "";

37: for(i = 0; i < list.length; i++) {

38: if(i != 0 && i % 10 == 0)

132

บทท่ี 4: Array และ String intro. to Java (FEU.faa)

39: result += "\n";
40: else
41: output = String.format("%4d", list[i]);
42: result += output;
43: }
44: JOptionPane.showMessageDialog(null,
45: result, "After sorting by Java",
46: JOptionPane.INFORMATION_MESSAGE);
47: }
48: }

ยังมี method อีกหลายตวั ใน class Arrays ทีเ่ ราสามารถเรียกใชได ทงั้ นกี้ ็ตอ งดวู า เรากําลงั ทําอะไร
อยู ในทีน่ ี้จะขอพูดอกี เพยี ง method เดยี วคือ binarySearch() เพราะวา เราไดพ ูดถงึ วิธกี ารเขยี น
code ของ binary search มากอนหนานแ้ี ลว โปรแกรม BinarySearch.java แสดงถึงวิธกี ารเรียกใช
method binarySearch() ที่วาน้ี

1: /**
2: Using search routine from class Arrays
3: Caution: data must already be sorted
4: */
5:
6: import java.util.Arrays;
7: import static java.lang.System.out;
8:
9: class BinarySearch {
10: public static void main(String[] args) {
11: //create list with 10 items
12: int[] list = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
13:
14: //random key to search for
15: int key = (int)(Math.random() * 10 + 1);
16:
17: //calling binary search from class Arrays
18: int found = Arrays.binarySearch(list, key);
19:
20: //display result to screen
21: if(found >= 0)
22: out.printf("Found %d at location: %d%n", key, found);
23: else
24: out.printf(key + " is not in the list!");
25: }
26: }

เราเรยี ก method binarySearch() ดว ย parameter 2 ตัวคอื (1) array ทีม่ ขี อมลู อยู – ในท่นี คี้ ือ list
และ (2) ขอ มูลทต่ี อ งการคน หา – ซ่ึงกค็ อื key ในโปรแกรมดา นบนน้ี ประโยค

int found = Arrays.binarySearch(list, key)

ถาขอมูลที่ตอ งการคนหาอยใู น list การเรยี ก method binarySearch() กจ็ ะไดค า ของ index ที่
ขอมลู นนั้ อยูสง กลับมายังตวั แปร found แตถ า หาไมเ จอคาทีส่ ง กลบั จะมีคา นอ ยกวา 0 เสมอ ดังน้ัน
การแสดงผลจงึ ตองเปรยี บเทียบคา ของ found กับคาของ 0 และเม่ือทดลอง run ดูผลลพั ธท ี่ไดคอื

Found 5 at location: 4

4.7 การสราง array ท่มี ขี อมลู เปน array (Array of arrays)

เราไดใ ช array ท่มี ขี อ มูลเปน primitive type จากตวั อยา งกอนหนาน้ีหลาย ๆ ตวั อยาง เรามาลองดู
การสราง array ที่มีขอ มูลเปน array ดู เราจะเรมิ่ ตนดว ยการประกาศ ดงั นี้

int[][] table = new int[5][5];

ซึ่งหมายถึงการประกาศใหต วั แปร table เปน array ทมี่ ขี อ มลู 5 ตวั โดยทแี่ ตละตัวนนั้ เปน array ท่ี
เกบ็ ขอมูลท่เี ปน int อยู 5 ตัว เราจะใช [][] สองตัวเปนตวั บอกให Java รูวา ตวั แปรตัวน้ีคือ array ท่ี
ใชเ ก็บ array โดยทั่วไปเรามกั จะเรยี ก array ในลักษณะนว้ี า array 2 มติ ิ ภาพที่ 4-2 แสดงถงึ เนื้อที่
ของ array table

133

เริ่มตน การเขยี นโปรแกรมดว ย Java

ชื่อของ array index ของขอ มูลในแตละแถว intro. to Java (FEU.faa)
และ ตําแหนง [0] [1] [2] [3] [4]
ของขอ มูลแตละ
ตวั (index)

table[0]

table[1]

table[2]

table[3]

table[4]

int [] [] table = new int [5] [5];

ภาพที่ 4-2 การสรา ง array ที่เกบ็ array (array 2 มติ ิ)

โปรแกรม TwoDArray.java ทเี่ ห็นดานลา งนแี้ สดงการใช array 2 มติ ิ โดยกําหนดใหมีขนาด 5 x 5
และกาํ หนดใหข อ มูลมีคา อยรู ะหวาง 1 ถงึ 10 ดว ยการสุมจาก random()

ความยาวหรอื ขนาดของ twoDArray หาไดจากคา คงที่ท่เี ก็บไว length เชน เดยี วกนั กับ array 1 มติ ิ
สวนขนาดของขอ มลู ท่ีอยใู นแตละแถวหาไดจ ากคาคงท่ีในแถวนั้น เชน

twoDArray[i].length

โดยที่ i เปน คา ของแถวนนั้ ๆ ใน twoDArray

1: /**
2: Two dimensional array
3: */
4:
5: import static java.lang.System.out;
6:
7: class TwoDArray {
8: public static void main(String[] args) {
9: int[][] twoDArray = new int[5][5];
10:
11: //populate array with random ints
12: for(int i = 0; i < twoDArray.length; i++) {
13: for(int j = 0; j < twoDArray[i].length; j++) {
14: twoDArray[i][j] = (int)(Math.random() * 10 + 1);
15: }
16: }
17:
18: //display content to screen
19: for(int i = 0; i < twoDArray.length; i++) {
20: for(int j = 0; j < twoDArray[i].length; j++) {
21: out.printf("%4d", twoDArray[i][j]);
22: }
23: out.printf("%n");
24:
25: }
26: }
27: }

134

บทท่ี 4: Array และ String

ผลลัพธของการ run โปรแกรม TwoDArray.java คอื

1 10 8 4 4 intro. to Java (FEU.faa)
7 6 10 4 2

42799
17889

74893

เรามาดูโปรแกรมตวั อยา งอีกตวั หนง่ึ ท่ีประกาศและกาํ หนดคาใหกับ array 2 มิตดิ ว ยการกาํ หนดแบบ
อตั โนมตั จิ าก Java เอง

1: /**

2: Declaring and initializing two dimensional array
3: */

4:
5: import static java.lang.System.out;

6:

7: class Array10 {
8: public static void main(String[] args) {
9: //declare 2-D array with specific data

10: int[][] twoDArray = { {1, 2, 3},
11: {5, 6, 8},
12: {7, 4, 6},

13: {4, 8, 9} };
14:

15: //display content to screen
16: for(int i = 0; i < twoDArray.length; i++) {

17: for(int j = 0; j < twoDArray[i].length; j++)

18: out.printf("%4d", twoDArray[i][j]);
19: out.printf("%n");
20: }

21:
22: }

23: }

เรากาํ หนดให twoDArray เปน array 2 มิติท่ีมจี าํ นวนแถวเทากบั 4 และจํานวนขอมลู ในแตละแถว
เทา กบั 3 โดยการกาํ หนดนนั้ เราตองใสข อมูลในแตล ะแถวในเคร่ืองหมาย {} และแบง ขอ มลู ท่ีอยแู ถว
ในแตล ะแถวดว ยเคร่อื งหมาย , ดังนี้

int[][] twoDArray = { {1, 2, 3}, /* แถว 0 */
{5, 6, 8}, /* แถว 1 */
{7, 4, 6}, /* แถว 2 */
/* แถว 3 */
{4, 8, 9}
};

เราสามารถทจี่ ะใหขอมลู อยูใ นบรรทัดเดยี วกันได เชน

int[][] twoDArray = {{1, 2, 3}, {5, 6, 8}, {7, 4, 6}, {4, 8, 9}};

หลังจาก run โปรแกรมแลว ผลลพั ธท ี่ไดค ือ

123
568
746
489

โปรแกรมตัวอยางท่ีจะแสดงใหดูตอไปนเี้ ปนการใช array 2 มติ ิในการคํานวณหาดอกเบีย้ ทบตน
(compound interests) ทีเ่ ราไดท ําไวใ นบทที่ 3 แตเ ราจะเพม่ิ ลูกเลนใหกบั การแสดงผลดว ยการ
เรยี กใช class JTextArea, JScrollPane, และ class Font

การคาํ นวณหาดอกเบยี้ ทบตนนัน้ เราสามารถใชส ูตรหาไดเ ลย (เชน ทที่ ําในบททีส่ าม) แตเราจะใช
วธิ ีการคาํ นวณแบบงาย ๆ ท่ีใช loop เขา มาชว ย ดังทีไ่ ดแ สดงไวในโปรแกรม
CompoundInterest.java น้ี

1: /**
2: Calculate compound interests using 2D array

135

เร่มิ ตนการเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)

3: Previously calculated using: a = p(1 + r)^n
4: see program Interests.java in chapter 3
5: */
6:
7: import javax.swing.JOptionPane;
8: import javax.swing.JTextArea;
9: import javax.swing.JScrollPane;
10: import java.awt.Font;
11:
12: class CompoundInterest {
13: public static void main(String[] args) {
14: final double START_RATE = 20;
15: final int RATES = 6;
16: final int YEARS = 10;
17:
18: //set interest rates to 20 ... 25%
19: double []interestRate = new double[RATES];
20: for(int i = 0; i < interestRate.length; i++)
21: interestRate[i] = (START_RATE + i) / 100.0;
22:
23: //set initial balances to 10000
24: double [][]balances = new double[YEARS][RATES];
25: for(int i = 0; i < balances[0].length; i++)
26: balances[0][i] = 10000;
27:
28: //calculate interest
29: for(int i = 1; i < balances.length; i++) {
30: for(int j = 0; j < balances[i].length; j++) {
31: double oldBalance = balances[i - 1][j];
32: double interest = oldBalance * interestRate[j];
33: balances[i][j] = oldBalance + interest;
34: }
35: }
36: //setup header: Year follows by interest rate
37: String output = String.format("%4s", "Year");
38: for(int i = 0; i < interestRate.length; i++)
39: output += String.format("%12.2f", 100*interestRate[i]);
40: output += "\n";
41:
42: //setup interest earned in tabular format
43: int y = 1;
44: for(double[] row : balances) {
45: output += String.format("%4d", y++);
46: for(double b : row)
47: output += String.format("%,12.2f", b);
48: output += "\n";
49: }
50: //display result
51: JTextArea area = new JTextArea(10, 30);
52: JScrollPane pane = new JScrollPane(area);
53: area.setFont(new Font("Courier", Font.PLAIN, 12));
54: area.append(output);
55: JOptionPane.showMessageDialog(null, pane,
56: "Compound Interest", JOptionPane.INFORMATION_MESSAGE);
57: }
58: }

กอนทีเ่ ราจะอธิบายถึงวิธกี ารแสดงผลในรปู แบบใหมน้ี เราจะอธบิ ายถงึ การใช array 2 มิติในการเก็บ
ขอ มูลกอ น ซึง่ ในสว นทเี่ ราเนนก็คือ array balances ท่ีไดป ระกาศไวใ นบรรทดั ที่ 24 พรอมกันนเ้ี ราก็
กําหนดใหเ งินเริ่มตน ของเรามีคาเปน 10000 โปรแกรมของเราจะคาํ นวณหาดอกเบี้ยภายในระยะเวลา
10 ป และจะใชอัตราดอกเบ้ยี เริม่ ตนท่ี 20% ไปจนถงึ 25%

หลังจากทเี่ ราไดก าํ หนดคา ของเงนิ เรม่ิ ตนดวย array balances และ array interest ท่ใี ชเ กบ็ อตั รา
ดอกเบ้ียแลว เราก็ทําการคาํ นวณหาดอกเบ้ยี ดว ยการใช for/loop สองตวั (บรรทัดที่ 29 ถงึ 35) โดย
ที่ for-i/loop จะเปนการคาํ นวณไปแนวตัง้ ซง่ึ จะทําทัง้ หมด 10 ครง้ั สวน for-j/loop จะเปน การ
คาํ นวณในแนวนอนจํานวนท้ังหมด 6 ครง้ั

ผลลพั ธท ี่เราไดจากการ run โปรแกรม คือ

136

บทที่ 4: Array และ String intro. to Java (FEU.faa)

ผลลพั ธท ี่เราไดม ี scroll bar ไวใหเราถา หากวาขอ มูลที่อยใู นหนาตา งมเี กินขอบเขตของตวั หนา ตาง
เอง วิธีการแสดงผลแบบน้จี ะเรียกใช class หลัก ๆ อยสู องตัวคือ JTextArea และ JScrollPane โดย
ข้ันตอนแรกที่เราทํากค็ อื กาํ หนดใหม กี ารใช JTextArea ท่ีมีขนาดเทากบั 10 แถว ๆ ละ 30 column
หลงั จากนั้นเราก็กาํ หนดใหม กี ารใช scroller ใน JTextArea ทีเ่ ราสรางขึ้น พรอ มกนั นีเ้ ราก็ทําการ
กําหนดให font ทีอ่ ยใู น JTextArea ของเราเปน Courier ขนาด 12 point ซง่ึ เมอื่ ไดก ําหนดเรยี บรอย
แลวเราก็ทาํ การนาํ ขอมลู ทีอ่ ยใู นตวั แปร output เขาไปเกบ็ ไวใน JTextArea ทเี่ ราไดเ ตรียมไว และ
เรากส็ ง JScrollPane ของเราไปให showMessageDialog() เหมอื นดังท่เี ราไดเ คยทาํ มากอนหนาน้ี

JTextArea area = new JTextArea(10, 30);
JScrollPane pane = new JScrollPane(area);
area.setFont(new Font("Courier", Font.PLAIN, 12));
area.append(output);
JOptionPane.showMessageDialog(null, pane,

"Compound Interest", JOptionPane.INFORMATION_MESSAGE);

ในการนําขอ มลู ออกจาก array 2 มติ เิ พือ่ เตรยี มที่จะสงใหกับ showMessageDialog() น้ันเราใช for-
in/loop เปน ตัวชว ยในการเดนิ เขา หา โดยท่ี for-in/loop ตวั แรกเปน การเดินเขา หาแถว สว น for-
in/loop ตัวทสี่ องเปนการเดนิ เขาขอมูลในแถวนัน้ ๆ (ดู code ในบรรทดั ที่ 43 ถึง 49)
ถาหากเราไมตอ งการท่ีจะใช scrollbar ในการแสดงผลของเรา เราก็ทาํ ไดด ว ยการสง JTextArea ไป
ให showMessageDialog() แทน JScrollPane ดงั เชน ตวั อยา งทแี่ สดงใหดนู ้ี

JTextArea area = new JTextArea(10, 30);
area.setFont(new Font("Courier", Font.PLAIN, 12));
area.append(output);
JOptionPane.showMessageDialog(null, area,

"Compound Interest", JOptionPane.INFORMATION_MESSAGE);

ผลลัพธท ่ีเราไดก จ็ ะเปน

137

เรมิ่ ตน การเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)

ผอู า นควรสังเกตวา showMessageDialog() ขยายขนาดของตวั เองออกเพื่อรองรับผลลพั ธท ไ่ี ดจ าก
การคาํ นวณ ทั้งนีแ้ ละทง้ั นน้ั ผูอานก็คงตองเลอื กเอาเองวา การแสดงผลแบบไหนเหมาะสมกับงานท่ี
ทําอยู
4.7.1 การใช array ทม่ี ีจํานวนของขอ มูลในแตละแถวไมเทา กนั

เราสามารถทีจ่ ะกาํ หนดใหข อ มูลในแตละแถวของ array มจี ํานวนไมเ ทากันได ดงั ตวั อยา งดานลางนี้

double [][] list = new double[5][];

ซ่งึ เปน การประกาศ array 2 มติ ิทม่ี ีจํานวนแถวเทา กับ 5 แตจ าํ นวนของขอมูลในแตล ะแถวยังไมไ ดถกู
กาํ หนด เราอาจกําหนดใหขอ มลู ในแถว 0 มจี าํ นวนเทากบั 4 และขอมลู ในแถว 4 มจี ํานวนทา กับ 10
เปน ตน ดังน้ี

list[0] = new double[4];
list[4] = new double[10];

สวนขอมูลในแถวที่เหลอื อยูกแ็ ลวแตว าเราอยากทีจ่ ะใหม ขี อ มูลก่ีตวั หรือเราอาจกําหนดใหข อมูลใน
แตล ะแถวมจี าํ นวนเทากบั คาท่เี พ่ิมขึน้ ตามคา ของแถว (index) เชน

int m = 0;
while(m < list.length) {

list[m] = new double[m + 1];
m++;
}

โปรแกรม Array11.java สรา ง array 2 มติ ิทีม่ ีขอ มลู ในแตล ะแถวเทา กับคา ของ index ในแถวนนั้ ๆ

1: /**
2: Array containing rows with different sizes
3: */
4:
5: import static java.lang.System.out;
6:
7: class Array11 {
8: public static void main(String[] args) {
9: //array with five rows
10: double [][]list = new double[5][];
11:
12: //allocate space for each row
13: int m = 0;
14: while(m < list.length) {
15: list[m] = new double[m + 1];
16: m++;
17: }
18:
19: //display initial content of array
20: for(int i = 0; i < list.length; i++) {
21: for(int j = 0; j < list[i].length; j++)
22: out.printf("%6.2f", list[i][j]);

138

บทที่ 4: Array และ String

23: out.println(); intro. to Java (FEU.faa)

24: }
25: }

26: }

เมอื่ run ดูผลลพั ธท่ีไดค ือ

0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00
0.00 0.00
0.00
0.00
0.00
0.00

การกําหนดขนาดของ array แบบนที้ ําใหก ารใชเ น้ือท่ีในการเกบ็ ขอมูลในแตละแถวมปี ระสิทธภิ าพ
มากข้นึ ทัง้ นก้ี เ็ พราะวาเราใชเฉพาะเนือ้ ที่ที่จําเปน ตองใชเทานนั้ ถาเราใชก ารกําหนดแบบเกาเราตอง
ใชห นว ยความจําเทากับ 8 x 25 = 200 byte แตถ าเราใชก ารกาํ หนดตามเทาที่ใช เราก็จะใช
หนว ยความจาํ เพียงแค 8 x 15 = 120 byte

การสรา ง array ทม่ี ีความจขุ องขอ มูลในแตล ะแถวไมเทากนั เออื้ อาํ นวยความสะดวกในการจองเนอ้ื ที่
ทาํ ใหการใชหนวยความจํามีประสิทธภิ าพมากยง่ิ ขึน้ แตก ารทาํ งานจะตอ งมีการระมดั ระวงั เปนพิเศษ
เพราะจาํ นวนของขอมูลในแตล ะแถวมจี าํ นวนไมทากนั ผูอา นตองใชค วามละเอยี ดในการออกแบบ ถา
ตองการใช array แบบนี้

ตวั อยา งการใช Array of arrays ในการหาคา max คา min และคา เฉล่ีย

1: /**

2: Finding maximum and minimum in 2d-array

3: */

4:

5: import static java.lang.System.out;

6:

7: class ArrayOfArrays {

8: public static void main(String[] args) {

9: //inititial scores

10: int [][]score = { {45, 87, 68, 57},

11: {98, 70, 58, 69},
12: {85, 42, 68, 82} };

13: double average; //average of scores

14: int max, min, total = 0;//maximum, minimum, and total

15: int count = 0; //total scores

16:

17: max = score[0][0]; //assuming max score is at [0][0]

18: min = score[0][0]; //assuming min score is at [0][0]

19:

20: //looping through rows

21: for(int i = 0; i < score.length; i++) {

22: //looping through columns
23: for(int j = 0; j < score[i].length; j++) {

24: if(score[i][j] > max) //find max score

25: max = score[i][j];

26: if(score[i][j] < min) //find min score

27: min = score[i][j];

28: total += score[i][j]; //calculate total

29: count++; //number of scores

30: }
31: }

32:

33: //calculate average of scores

34: average = (double)total / count;

35:

36: out.println("Maximum score is " + max);

37: out.println("Minimum score is " + min);

38: out.printf("Average score is %4.2f", average);

39: }

40: }

โปรแกรม ArrayOfArrays.java กําหนดให score เปน array ท่ีเกบ็ ขอมลู เปน จํานวนเทา กับ 3 แถว
แถวละ 4 ตัว เราจะหา score ทีเ่ ล็กทีส่ ุด score ทีใ่ หญที่สุด รวมไปถงึ การคาํ นวณหาคาเฉลย่ี ของ

139

เริ่มตนการเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)

score ทงั้ หมด เราใช for – loop 2 ตัวในการเขา หา array ของเราเหมอื นเดิม พรอ มทง้ั ตรวจสอบวา
score ตัวไหนเปน max และ score ตวั ไหนเปน min ดวยการกําหนดใหท ง้ั สองตัวแปรมีคาเปน ขอมลู
ตวั แรกสุดทีอ่ ยูใ น array และจะทําการเปรียบเทยี บขอ มลู ณ ตําแหนง ท้ังหมดใน array กบั ขอมลู นี้
ประโยค

if(score[i][j] > max)
max = score[i][j];

จะเปลยี่ นคาของ max ใหม คี าเทากบั score[i][j] ถา ขอ มูลทตี่ ําแหนงนมี้ ากกวา คาของ max และ
ประโยค

if(score[i][j] < min)
min = score[i][j];

จะเปลีย่ นคาของ min ใหม ีคา เทากับ score[i][j] ถาขอ มลู ทต่ี ําแหนงน้นี อ ยกวา คาของ min วธิ กี าร
หาคา ของ max และ min แบบน้ีสามารถนําไปใชไ ดกับการหาคา max และ min โดยทวั่ ไปไดโดย
ไมตองสนใจวา ขอมูลทอ่ี ยูภ ายใน array จะมี range อยูชวงไหน ทัง้ น้ีเพราะเราใชขอมูลตัวแรกสุด
เปนตัวตรวจสอบกอ น ทําใหก ารหาคาของทงั้ max และ min เปน ไปไดโ ดยไมตองกาํ หนดคา ใหกบั
ตวั แปร max หรือ min ใด ๆ ท้ังสน้ิ (ถา เราไมต อ งการตรวจสอบเอง เราก็สามารถท่ีจะเรยี กใช
method max() และ min() ทม่ี อี ยูใน class Math ได – ดใู นบทกอน ๆ) ในสวนของการหาคาเฉลย่ี ก็
เหมือนกับทเ่ี ราไดเ คยทาํ มาแลวกอ นหนานี้

การใช array of arrays น้ันก็เหมือนกับท่ีเราใชต าราง หรอื table ในการเก็บขอ มลู ตา ง ๆ หนังสือ
หลาย ๆ เลมเรยี ก array of arrays ที่มีแค row และ column วา array 2 มติ ิ (two dimensional
array) สว น array of arrays ท่มี ีขอ มลู เปน array อีกเราก็มักจะเรยี กวา array 3 มิติ เปน ดงั นี้ทุกคร้งั
ทีม่ กี ารเพม่ิ มิตใิ หก บั array แตก ารมองเห็นหรือการใชก ็คงมนี อย ถาหากวา จํานวนมติ ทิ ่ใี ชมมี ากกวา
3 มิติ เพราะวาคนเราชนิ กบั การมองเห็นแบบ 3 มิติตลอดเวลา (เราจะท้ิงใหผูอา นศกึ ษาในเรือ่ งของ
array 3 มติ เิ อง)

4.8 String

การใช string น้นั สามารถทาํ ไดหลาย ๆ วธิ ี และวิธีแรกท่ีเราจะทําความรูจกั นั้นเปนการใช array เปน
หลักในการทํางานกับ string นน้ั ๆ เราคงไมสามารถท่ีจะเรียก string ในลกั ษณะนไ้ี ดเตม็ ปากเต็มคํา
มากนกั เพราะวาโดยความเปน จรงิ แลว array ที่เราใชในการทาํ งานทเ่ี กีย่ วขอ งกบั String นัน้ ไมใช
string โดยตรงแตเ ปน array ทีเ่ ก็บ char หลาย ๆ ตวั ไว หรอื ท่ีเรียกกันวา array of characters ซ่งึ
หนงั สือหลาย ๆ เลมก็มกั จะเรยี ก string วา array of characters เราจะตรวจสอบวิธกี ารใช string
แบบน้ีพอสงั เขป แลว เราจะกลับมาพูดถงึ String ของ Java อยางละเอียดอีกทีหนึ่ง

4.8.1 Array of characters

การประกาศ string แบบนที้ าํ ไดงา ย ๆ เหมือนกับที่เราประกาศใช array ท่ีเก็บขอมูลชนิดอื่น
เพียงแตเ ราเปล่ียนให array เก็บ char แทนเทา นน้ั เชน

char [] string = new char[20];

การประกาศดา นบนนี้เปนการสราง array ท่ใี ชเ กบ็ char จํานวนเทากับ 20 ตวั โปรแกรมตัวอยา ง
ดานลา งแสดงการใช array of characters

1: /**
2: Array of characters
3: */
4:
5: import static java.lang.System.out;
6:
7: class ArrayOfChars {
8: public static void main(String[] args) {
9: //declare array of char
10: char[] string = new char[26];
11: int i = 0;
12:
13: //populate string with characters a to z
14: for(char c = 'a'; c <= 'z'; c++, i++) {
15: string[i] = c;

140

บทที่ 4: Array และ String intro. to Java (FEU.faa)

16: }
17:
18: //print all characters to screen
19: for(char ch : string) {
20: //convert to upper case if it's a vow
21: switch (ch) {
22: case 'a' : case 'e' :
23: case 'i' : case 'o' : case 'u':
24: ch = Character.toUpperCase(ch);
25: }
26: out.printf("%2c", ch);
27: }
28: System.out.println();
29: }
30: }

โปรแกรม ArrayOfChars.java เร่ิมตนดว ยการสราง array of chars จาํ นวน 27 ตัวจากประโยค

char[] string = new char[26];

หลงั จากน้ันกใ็ ช for/loop ในการกาํ หนดคาใหก บั ทกุ ๆ ตําแหนง ของ str ดว ยการใช char เปน
index ของ loop เนื่องจากวา การเพ่ิมคา ใหก ับ char นั้นทีจ่ ริงแลว เปน การเพ่มิ คาใหกับตัวเลขทเี่ ปน
ตวั แทนของตัวอักษรนน้ั ๆ เชน ถา เรากําหนดให char c = 'f' การเพมิ่ คาใหก ับ c หน่งึ ครงั้ จะทําให c
มีคาเปน 'g' ซ่งึ เปนตัวอักษรท่ีอยถู ัดไปในตาราง ASCII เพราะฉะนัน้ การใช for/loop นก้ี ท็ ําใหเ กดิ
การกาํ หนดคา ใหก ับ string ทุกตําแหนง

for(char c = 'a'; c <= 'z'; c++) {
str[i] = c;
i++;

}

ในการแสดงผลของขอมลู ทีอ่ ยูใน string น้ันเราไดเ พิ่ม code สําหรบั การตรวจสอบวาตวั อักษรท่ีเรา
จะแสดงนัน้ เปน สระหรือไม ซงึ่ ถา เปน เรากจ็ ะเปลย่ี นตวั อักษรนนั้ ใหเปนตวั ใหญ ดงั ที่เห็นในผลลัพธ
ของการ run นี้

AbcdEfghIjklmnOpqrstUvwxyz

การใช array of characters น้นั ไมคอยจะสะดวกมากนัก ทง้ั นีเ้ พราะเปน การทาํ งานที่เก่ียวกับ array
เราอยากทจี่ ะมี string จรงิ ๆ ท่ีเราสามารถทจ่ี ะทาํ กระบวนการตา ง ๆ ได เชน บวก string 2 ตัวเขา
ดวยกนั หรือตรวจสอบความเทากนั ความเหมอื นกนั ของ string อยางนี้เปนตน และ Java กม็ ี class
String ใหเราเรียกใชง านทเ่ี กย่ี วขอ งกบั string โดยตรง

4.8.2 String ใน Java

String ใน Java นั้นเปน object ดังน้ันเราจงึ จําเปนตอ งเรยี กใช class String ในการสรา ง string เพอ่ื
การใชง านของเรา เชน เราอาจตอ งการเกบ็ ช่ือของ user ไวใ นโปรแกรม หรือสงขอ ความที่เปน
string ไปให user อยา งน้เี ปนตน

การประกาศใช String กไ็ มย าก ซง่ึ ทําไดด ังน้ี

String str = new String("Java is fun");

หรือแบบนี้

String str = "Java is fun";

โดยเฉพาะการประกาศในประโยคทส่ี องน้ี มีผลเทากับประโยค 2 ประโยคตอ ไปนี้

char[] str = {'J', 'a', 'v', 'a', ' ', 'i', 's', ' ', 'f', 'u', 'n'};
String str = new String(str);

จะเห็นไดว า string กค็ ือ array of chars นั่นเอง บางครงั้ การประกาศตัวแปร string โดยทไ่ี มม ีการ
กําหนดคา ใหกบั string นน้ั เราก็ทาํ ไดด วยการประกาศเหมือนกับการประกาศตัวแปรชนดิ อ่ืน เชน

141

เรม่ิ ตน การเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)

String name;

ซึง่ มคี วามหมายวา ตวั แปร name เปน string ทไี่ มไ ดอา งถงึ คา ใด ๆ เลย และถาเราเรยี กใช string ที่
มีการประกาศแบบนีจ้ ะมี error เกิดขึน้ วิธกี ารแกไ ขน้นั เราตอ งกาํ หนดคา null ใหกับ string name
ดงั น้ี

String name = null;

ซึ่งบอกให Java รูว า string name ไมไ ดอ างถึงขอมลู ใด ๆ เลย เราสามารถท่ีจะอา งถงึ ขอ มูลใด ๆ ก็
ไดหลงั จากน้นั แตถา เราตอ งการท่ีจะสราง string ทีไ่ มม ขี อ มูลใด ๆ อยูเลยเราตองประกาศแบบนี้

String emptyString = "";

String name = null ตา งกบั String emptyStr = "" ตรงท่วี า เราสามารถใช String emptyStr ได
ทันทีท้งั น้ีเพราะวา การประกาศดงั กลาวไดกาํ หนดให emptyStr มคี าอยแู ตย ังไมม กี ารกาํ หนดใหมคี า
เปนกลุม ของตัวอกั ษรใด ๆ สว น name ไดถูกกําหนดใหช ้ีไปที่ null ซ่งึ เปนการบอกวา name ยงั
ไมไดช ี้ไปยัง object ใด ๆ (ซงึ่ ในบางคร้งั เราก็ไมรูวาเราจะกําหนดให string ชไี้ ปท่ี Object ใดแตรู
วาตอ งเปน string ทช่ี ี้ไปยงั object)

str1 HEL LO String str1 = "HELLO";

str2 ?? String str2 = null;

str3 String str3 = "";

ภาพที่ 4-3 การกําหนดคา ใหก บั String

ถาเราไดกําหนดคาให string เปน empty string เราสามารถทจ่ี ะใช method length() ในการหาคา
ความยาวของ empty string ได (ซง่ึ ตองเปน ศูนย เชน str3.length() จะมคี า เปนศนู ย และ
str1.length() จะมคี า เปน 5) สวน null string เราจะได error ทเี่ ปน NullPointerException แทน

ลองมาดโู ปรแกรมตวั อยา งการทํางานกบั string

1: /**
2: Simple string operations
3: */
4:
5: import static java.lang.System.out;
6:
7: class StringOps {
8: public static void main(String[] args) {
9: String first = "Java ";
10: String second = "Programming";
11: String third = null;
12: int percent = 100;
13:
14: third = first + second;
15: out.printf("%s is a %d fun!%n", third, percent);
16: }
17: }

142

บทที่ 4: Array และ String intro. to Java (FEU.faa)

โปรแกรม StringOps.java ประกาศตัวแปรทีเ่ ปน String 3 ตวั คือ first second และ third โดย
กําหนดให first มีคา เปน "Java " second มคี าเปน "Programming" และ third ไมมีคา อา งองิ ถึง
string ใด ๆ พรอมกนั นี้เราไดกําหนดใหต ัวแปร percent มีคาเปน 100 ประโยค

third = first + second;

ทําการรวม first และ second เขาดว ยกัน ซงึ่ ทาํ ให third มีคาเปน "Java Programming" และใน
ประโยคที่ทาํ การแสดงผลไปหนาจอนนั้ เราไดเพิ่มการแสดงผลคา ของตวั แปร percent และ string
คงทต่ี ัวอืน่ เขา ไปดวยเพือ่ ใหผ ลลัพธเปน

Java Programming is a 100% fun!

เราสามารถที่จะรวมคา ของตัวแปรอ่นื ทไ่ี มใช string เขา กบั string ไดดงั นี้ สมมตวิ าเราเพิม่ ตวั แปร
ตอไปนี้

String isa = " is a ";
String fun = "%fun!";

และเรารวม String และ int เขาดวยกนั ดว ยประโยค

third = first + second + isa + percent + fun;

เราก็จะไดผลลัพธเหมอื นกันกบั ทเ่ี ราไดทาํ กอ นหนา น้ี สาเหตทุ ที่ ําไดเ พราะ Java จะเปลย่ี น int ให
เปน string กอนท่จี ะรวมเอา string ท้งั หมดเขา ดวยกัน
Java ไดก าํ หนดให String เปน immutable object ซึ่งหมายความวาเมื่อไดก ําหนดคาใหก ับ String
แลว เราไมส ามารถจะเปลย่ี นคา ของ String น้นั ๆ ได ลองกลับมาดภู าพประกอบการประมวลผลของ
string ในโปรแกรม StringOps.java เชน ประโยคในบรรทัดที่ 9 - 10

Stack memory Heap memory
first Java

second Programming
... ??

third Java Programming
third = first + second;

ภาพที่ 4-4 ขอมูลทเี่ กดิ ขน้ึ จากการกําหนดคาให string

ประโยคการประกาศตวั แปร และกาํ หนดคา ใหก บั string ทั้งสามตวั ตอนแรกน้นั ไมม ีอะไรยุง ยาก หรือ
ซับซอ น แตพ อเรากําหนดคา ใหกับ string third น้ันสิ่งทเ่ี กดิ ขึน้ คือ Java จะจดั สรรเนื้อที่ใหกบั
string Æ "Java Programming" ใน heap memory หลังจากนั้นจงึ กาํ หนดให third อางถงึ string
ทว่ี านี้ และสมมติวาเราเขยี นประโยคใหมด ังนี้

second = third;

143

เร่ิมตนการเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)

สงิ่ ทเ่ี กดิ ขน้ึ กค็ ือ second จะชี้ (หรือ อา งถึง) ไปที่ที่ third ชอ้ี ยูท ําใหเ ราไมสามารถเขาหาขอ มูลเดิม
ของ second ได

4.8.3 การเปรียบเทียบ String

เราไมสามารถทจ่ี ะเปรยี บเทยี บ string 2 ตวั ดว ยการใช == ไดเ หมอื นกบั ทเี่ ราทํากับตวั แปรที่เปน
primitive type ได เชน

first == third

เพราะวาประโยคดังกลาวจะเปรยี บเทยี บวา string ทั้งสองตัวอา งถึงท่เี ดียวกนั หรอื ไม (ทที่ ี่เกบ็ string
ใด string หนงึ่ ) เชน ถา เรามี

String myString = "Motorcycle";
String yourString = myString;

ซงึ่ ทาํ ใหต ัวแปร myString และ yourString อางถงึ ขอ มลู เดียวกัน (และจะใหคา true ถามีการ
เปรียบเทยี บดว ย ==) ไมใ ชการเปรียบเทยี บถึงขอมลู ท่ีตัวแปรท้งั สองอา งอยู เชนถา เรามี string
ตอไปน้ี

String keyboard = "from Thailand";
String kb = "from Thailand";

ถา เราเปรยี บเทียบดวยการใช

if(keyboard == kb) …

เราจะไดค า false ถงึ แมว าตัวแปรทง้ั สองจะมีคาท่ีเหมือนกนั ทง้ั น้ีเพราะวา เครอ่ื งหมาย == จะ
เปรยี บเทยี บคาอา งอิง (ท่อี ยู หรือ address ในหนว ยความจาํ ) ของตวั แปรทงั้ สองไมใชค าทท่ี ง้ั สอง
ตวั แปรเก็บไว เราตอ งใช method อื่นท่ี Java มใี หใ น class String

โปรแกรมตัวอยา งของการเปรียบเทยี บ string

1: /**
2: Comparing strings
3: */
4:
5: import static java.lang.System.out;
6:
7: class StringCompare {
8: public static void main(String[] args) {
9: String first = "Java ";
10: String second = "Programming";
11: String third = "Java Programming";
12: String forth;
13:
14: forth = first + second; //forth is "Java Programming"
15: if(third == forth)
16: out.println("third and forth refer to the same string");
17: else
18: out.println("thrid and forth do not refer to the same string");
19:
20: first = forth; //first and forth refer to the same string
21: out.println("first is " + first);
22: out.println("forth is " + forth);
23: if(first == forth)
24: out.println("first == forth is true");
25: else
26: out.println("first == forth is false");
27: }
28: }

โปรแกรม StringCompare.java แสดงถึงการเปรียบเทยี บ string ดว ยการใชเครอ่ื งหมาย == ถา เรา
สังเกตใหดีจะเห็นวา string third และ forth มีคาทเ่ี หมือนกนั (string ทป่ี ระกอบไปดวย char ที่
เหมอื นกันหมด) เม่อื run ดผู ลลัพธทไ่ี ดค อื

144

บทท่ี 4: Array และ String intro. to Java (FEU.faa)

third and forth do not refer to the same string

ซ่งึ บอกใหเ รารูวา การใชเคร่อื งหมาย == เปรียบเทียบความเหมอื นหรือความแตกตางของ string
ไมไ ด เชน เดยี วกันกบั ประโยคเปรยี บเทยี บถัดมาในโปรแกรม เรากําหนดให first อางถงึ ขอมลู ท่ี
เดียวกนั กบั forth และเม่ือเรา run ผลลัพธทไ่ี ดกเ็ หมือนกบั ที่เราไดค าดหวงั ไวคอื

first is Java Programming
forth is Java Programming
first == forth is true

ถาเราตองการท่ีจะเปรยี บเทยี บ string จริง ๆ เราตองใช method equals() และ method
compareTo() ดงั โปรแกรมตัวอยางตอไปน้ี

1: /**
2: Comparing strings
3: */
4:
5: import static java.lang.System.out;
6:
7: class StringCompare1 {
8: public static void main(String[] args) {
9: String first = "Java ";
10: String second = "Programming";
11: String third = "Java ProgramminG";
12: String forth;
13:
14: forth = first + second;
15: if(third.equals(forth))
16: out.println("third equals forth");
17: else
18: out.println("thrid not equals forth");
19:
20: first = forth;
21: if(first.equals(forth))
22: out.println("first equals forth");
23: else
24: out.println("first not equals forth");
25: }
26: }

เราไดเ ปล่ียนให third มีคา เปน "Java ProgramminG" เพอื่ ที่จะแสดงใหเ หน็ วา ในการเปรยี บเทียบ
น้ัน char ทกุ ตวั จะตองเหมือนกนั ผลลัพธทีเ่ ราไดจากการ run คอื

third not equals forth
first equals forth

เราใชประโยค third.equals(forth) ในการเปรยี บ third และ forth วา มีคา ทีเ่ หมือนกัน (เทากนั ) ซง่ึ
ถา เทา กนั จรงิ ผลลัพธท ไ่ี ดจากการเปรียบจะมีคาเปน true และจะใหค า false ถาไมเ ทากนั

การเปรียบเทยี บ string 2 ตวั เพ่อื ตรวจสอบความเทา กนั นัน้ เราจะเอาตัวไหนอยูดา นหนา ก็ได เชน

third.equals(forth) หรอื forth.equals(third) กไ็ ด

method equals() จะตรวจสอบตวั อักษรทุกตวั ที่อยูใน string โดยใหความสนใจในเร่อื งของตวั อักษร
วาเปนตัวอักษรตัวเลก็ หรอื ตวั ใหญ การตรวจสอบจะใหคา ท่เี ปนจริงถาเหมือนกันทัง้ รปู รางและขนาด
เชน g หรอื G ไมใชตัวอักษรตัวเดียวกัน การตรวจสอบจะเปน false

ในการเปรียบเทียบบางครง้ั เรากไ็ มส นใจวาตัวอักษรทอ่ี ยภู ายใน string นั้นเปน ตัวเลก็ หรอื ตัวใหญ ซ่งึ
ถา เราตองการเพียงแตต รวจสอบถึงความเหมอื นทางรปู รา งเราก็ตอ งใช method
equalsIgnoreCase() ในการเปรียบเทียบ string นน้ั ๆ

ถาเราเปล่ยี นการเปรียบเทียบในโปรแกรมตวั อยา งกอนหนา นีจ้ ากการใช equals() มาเปน
equalsIgnoreCase() ดงั นี้

145

เร่ิมตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)

if(third.equalsIgnoreCase(forth))
System.out.println("third equals forth");

else
System.out.println("thrid not equals forth");

เราก็จะไดผ ลลัพธเปน

third equals forth

4.8.4 การเปรียบเทยี บความไมเ ทากันของ string

หลาย ๆ ครัง้ เราตอ งตรวจสอบถึงความมากกวา หรือ นอยกวา ของ string เพอ่ื ใหการจดั เก็บ string
นน้ั ๆ อยูใ นรูปแบบท่ีมีการจดั เรียง ไมว า จะเปนจากนอยไปหามาก หรอื มากไปหานอ ย ในการ
ตรวจสอบวา string ตัวไหนมากกวาหรือนอ ยกวากันน้นั เราจะใช method compareTo() เชน

myString.compareTo(yourString);

สมมติวา myString มีคา เปน "lovely bike" และ yourString มคี า เปน "lovely kite" การเปรยี บเทียบ
ดวย compareTo() จะใหคาท่ีเปน บวก ทัง้ นี้ก็เพราะวา ตวั อกั ษร 'k' ใน yourString นั้นมคี ามากกวา
ตวั อกั ษร 'b' ใน myString เรามาดโู ปรแกรมตวั อยางการใช method compareTo() กันดกี วา

1: /**
2: Compare strings using compareTo()
3: */
4:
5: import static java.lang.System.out;
6:
7: class StringCompareTo {
8: public static void main(String[] args) {
9: String first = "lovely bike";
10: String second = "lovely kite";
11: String third = "lovely";
12:
13: //compare first and second
14: if(first.compareTo(second) > 0)
15: out.println("first is greater than second");
16: else
17: out.println("second is greater than first");
18:
19: //compare first and third
20: if(first.compareTo(third) > 0)
21: out.println("first is greater than third");
22: else
23: out.println("third is greater than first");
24:
25: String a = "A";
26: String z = "Z";
27: String str1 = "AAA";
28: String str2 = "AAA";
29:
30: //compare a and z
31: if(a.compareTo(z) < 0)
32: out.println(a + " is less than " + z);
33:
34: //compare str1 and str2
35: if(str1.compareTo(str2) == 0)
36: out.println(str1 + " equals " + str2);
37: }
38: }

ผลลัพธท่ีเราไดจากการ run คือ

second is greater than first
first is greater than third
A is less than Z
AAA equals AAA

146


Click to View FlipBook Version