Loops in Java
Tags: beginners, java
Published: 2021-07-02 05:35:32

Loop ဆိုတာက သတ်မှတ်ထားတဲ့ condition မဖြစ်မချင်း ထပ်ကာထပ်ကာ အလုပ်လုပ်စေဖို့ ညွှန်ကြားပေးနိုင်တဲ့ iteration statement တွေဖြစ်ပါတယ်။
program မှာ loop တွေ ကို ပုံစံ အမျိုးမျိုး သုံးလေ့ရှိပါတယ် ။ ဥပမာ - program ထဲမှာ ၁ ကနေ ၁၀၀ အထိ နံပါတ်များကို print ချင်တယ်ဆိုရင် `system.out.println()` အကြောင်း ၁၀၀ ရေးရမယ့်အစား loop အခါ ၁၀၀ ပတ်ပြီးထုတ်လို့ရပါတယ်။

Java မှာ 
1. for loop
2. while loop
3. do-while loop
ဆိုပြီးအဓိက loop သုံးမျိုးရှိပါတယ်။

## for loop
for loop ကိုဘယ်အချိန်မှာ အသုံးပြုသင့်လဲဆိုတော့ program ထဲမှာ loop လုပ်ရမယ့် အရေအတွက် အတိအကျသိရင် for loop ကိုအသုံးပြုသင့်တယ်။
for loop ထဲမှာလည်း အမျိုးအစားအလိုက် အောက်ပါ ၃ မျိုးရှိပါတယ်။

* traditional for loop
* enhanced for loop
* labeled for loop

### Traditional for loop
Traditional/Simple for loop က counter အပေါ်မှာမူတည်ပြီး loop ပတ်တဲ့ပုံစံဖြစ်ပါတယ်။ သူ့မှာ initialization (စမှတ်) ရယ် condition စစ်ဆေးခြင်း(ဆုံးမှတ်)ရယ် increment/decrement value (ထပ်တိုး/ထပ်လျော့တန်ဖိုး) ဆိုပြီးသုံးခုပါ၀င်ပါတယ်။

Syntax:
```java
for(initialization; condition; increment/decrement){
//code to be executed  
}
```
ဒါဆိုရင် ဥပမာ တစ်ခုလုပ်ကြည့်ရအောင် ကျွန်တော်တို့  hello world ဆိုတဲ့စာသားကို 10 ခါထုတ်မယ့် program ပေါ့။

{% replit @HeinKhantZaw/forLoopOne %}

ဒီ program မှာ startpoint ဆိုတဲ့ int variable တစ်ခုကိုတည်ဆောက်ပြီး 0 ပေးလိုက်ပါတယ်။ condition ကိုတော့ startpoint က 10 အောက်ငယ်တဲ့အထိအလုပ်လုပ်မယ်လို့ပြောထားပါတယ်။ increment value မှာ startpoint++ လို့ပြောတာက loop တစ်ခါပတ်ပြီးတိုင်း startpoint value ကို 1 တိုးမယ်လို့ပြောထားတာပါ။ ဒီတော့ program flow ကိုကြည့်မယ်ဆိုရင် for loop statement ရောက်တာနဲ့ အရင်ဆုံး startpoint တန်ဖိုး 0 နဲ့စမယ်။ condition ကိုစစ်ဆေးတော့ 10 ထက်ငယ်တယ်။ အဲ့တော့ condition မှန်သွားလို့ loop ထဲဆက်သွားမယ်။ နောက်ပြီး increment/decrement နေရာရောက်တော့ startpoint++ ဆိုတာ ကြောင့်ချက်ခြင်းမတိုးသေးဘဲ loop statement အဆုံးမှ 1 တိုးမှာပါ။တကယ်လို့ ++startpoint ဆိုရင်တော့ ဘာမှမလုပ်ခင် startpoint value အရင်တိုးမှာဖြစ်ပါတယ်။ အဲတော့ဆက်သွားရမယ်ဆိုရင် ` system.out.println(“hello world”); ` ဆို တဲ့ output တစ်ခုထွက်လာမယ်။ ပြီးတော့ နောက်ထပ် loop တစ်ခါပတ်တော့ increment value 1 တိုးခဲ့ပြီဖြစ်လို့ startpoint = 1 အဖြစ်နဲ့ condition စစ်ဆေးတယ် 10 အောက်ကငယ်နေသေးတာကြောင့် loop ဆက်သွားမယ် နောက်ထပ် ` system.out.println(“hello world”); ` ကို ထပ်ထုတ်မယ်။ ဒီလိုနဲ့ startpoint = 9 အထိပတ်တဲ့ အခါမှာ နောက်ဆုံး 10 ကြိမ်မြောက်ရောက်တဲ့အခါမှာ startpoint < 10 မဖြစ်တော့တာမို့လို့ loop ရပ်သွားပါတယ်။
 
ဒီနေရာမှာ တစ်ခု ပြောချင်တာက တကယ်လို့ ကိုယ်က decrement value သုံးပြီး loop ပတ်ချင်လည်းပတ်လို့ရပါတယ်။ အဲ့အခါဘယ်လိုပုံစံဖြစ်သွားမလဲဆိုတော့ 
{% replit @HeinKhantZaw/forLoopTwo %}

#### Infinite for Loop
နောက်တစ်ခုကတော့ ကျွန်တော်တို့ for() ထဲမှာ ဘာမှမကြေညာဘဲ semicolons နှစ်ခုပဲ ရေးထားမယ်ဆိုရင်ကော? ဘယ်လိုဖြစ်သွားမလဲ? အဖြေကတော့ ဒီ loop ဟာ ဘယ်တော့မှ ရပ်တော့မှာမဟုတ်တဲ့  infinite loop ဖြစ်သွားပါလိမ့်မယ် ။ဒါပေမယ့်ရပ်ဖို့အတွက်ကတော့ Ctrl+c (or) Command+c  ကိုတွဲနှိပ်ရင်တော့ ရပ်ပါတယ်နော်။

Syntax:
```java 
for( ; ; ){
//code to be executed
}
```

ဒါဆိုရင် သင်မရပ်မချင်း ဘယ်တော့မှရပ်မှာမဟုတ်တဲ့ program တစ်ခုစမ်းရေးကြည့်ရအောင်။
{% replit @HeinKhantZaw/forLoopInfinite %}

Program run လိုက်မယ်ဆိုရင်တော့ မရပ်ဘဲ run နေတဲ့ loop တစ်ခုကို ရမှာဖြစ်ပါတယ်။ မျက်စိနောက်လောက်အောင်ကိုတက်လာပါလိမ့်မယ်။ Ctrl+c (or) Command+c သာနှိပ်လိုက်ပါ။

#### Nested for Loop 
Nested Loop ဆိုတာ Loop ထဲမှာ Loop တွေထပ်ပတ်ထားတဲ့ဟာပါ။ အများဆုံးကတော့ for loop တွေမှာတွေ့ရပါတယ်။ကျွန်တော်တို့ nested loop တွေကိုတစ်ချက်ရေးကြည့်ကြရအောင်။

{% replit @HeinKhantZaw/forLoopNested %}

ဒီ program မှာ for loop နှစ်ခါပတ်ထားပါတယ်။ ပထမ for loop မှာက အရင်ဆုံး i တန်ဖိုးနဲ့ ပတ်တာပါ။ i < 5 ဆိုတော့ 5 ခါပေါ့။ အဲ့ဒီ i နဲ့ပတ်တဲ့ for loop ထဲမှာမှ j နဲ့ထပ်ပတ်တာပါ j < 5 ကလည်း j ကို ၅ခါထပ်ပတ်ထားပါတယ်။ အဲဒီတော့ i loop တစ်ခါပတ်တိုင်း j loop ထဲမှာ ရှိတဲ့ အလုပ် ၅ ခုလုပ်ပါတယ်။ j loop ထဲကိုကြည့်လိုက်ရင် `System.out.print("*"+" ");` ဖြစ်တဲ့အတွက် * ငါးခုကို ဘေးတိုက် * * * * * ဆိုပြီး output ထွက်ပါမယ်။ သူ အောက်မှာမှ i loop ထဲမှာ `println()` ရေးထားတဲ့အတွက် နောက်တစ်ကြောင်းဆင်းသွားပါမယ်။ ဒီလိုနဲ့ i loop ၅ပတ်လည်း ပြည့်ရော * * * * * ငါးကြောင်း output ထွက်လာပြီး လေးထောင့်တုံးပုံစံတွေ့ရမှာဖြစ်ပါတယ်။

ဒါကတော့ traditional for loop အသုံးပြုနည်းဖြစ်ပါတယ်။

### Enhanced For Loop
Enhanced For Loop(For-Each Loop) ကို array (သို့) collection တွေကိုမှာ အသုံးပြုလေ့ရှိပါတယ်။ ဘာလို့လဲဆိုတော့ အဲ့ loop က increment value မလိုအပ်သလို တခြားဘာမှလည်းမလိုအပ်ပါဘူး။ For-Each Loop က array ရဲ့ index ပေါ်မှာ အလုပ်လုပ်တာမဟုတ်ဘဲ elements တွေပေါ် မှာလုပ်တာဖြစ်ပါတယ်။ ဒီ Loop ကိုသုံးလိုက်တဲ့အခါမှာ array ထဲက elements တွေကို သတ်မှတ်ထားတဲ့ variable ထဲကို တစ်ခုချင်း return ပြန်ပေးသွားမှာဖြစ်ပါတယ်။

Syntax:
```java
for(dataType variable: array_name){
//code to be executed;
}
```
Example တစ်ခုရေးကြည့်ရအောင် 

{% replit @HeinKhantZaw/forEachLoop %}

ဒီ example မှာဆို ကျွန်တော်က arr လို့ခေါ်တဲ့ integer array တစ်ခုကို တည်ဆောက်ထားတယ်။ အဲဒီထဲမှာ integer value တွေဖြစ်တဲ့ 12,23,44,55,44,66 သိမ်းထားပါတယ်။ အဲဒါကို For-Each Loop နဲ့ loop ပတ်ဖို့အတွက် for() ထဲမှာ int i ဆိုပြီး variable တစ်ခုကိုတည်ဆောက်ပါတယ် ပြီးတော့ ကျွန်တော်တို့ရဲ့ array နာမည်ကိုထည့်ပေးလိုက်တာပါဘဲ ဒီတော့ ဘယ်လိုဖြစ်သွားလဲဆိုတော့ loop ပတ်တဲ့အခါမှာ array ထဲမှာရှိတဲ့ elements တွေက ကျွန်တော်တို့တည်ဆောက်ထားတဲ့ variable i ထဲကိုရောက်ပြီး return ပေးပါတော့တယ် ဒီတော့ ကျွန်တော်တို့ array ထဲက element တွေ output ထွက်လာပြီဖြစ်ပါတယ်။

### Labeled For Loop
Labeled For Loop ကတော့အသုံးနည်းတဲ့ loop တစ်ခုပါ။ သူကကျတော့ loop တစ်ခုချင်းစီကို label ပေးလို့ရတဲ့ loop ဖြစ်ပါတယ်။ ရေးရမယ့် ပုံစံကတော့ for loop မတိုင်မီ label (နာမည်) တစ်ခု အရင်ပေးရပါတယ်။ အကယ်၍ program ထဲမှာ nested for loop ရှိပါက loop တစ်ခုချင်းစီကို label တပ်ပြီး break/continue keyword တွေနဲ့ control လို့ရပါတယ်။

Syntax:
```java
labelName:  
for(initialization; condition; increment/decrement){  
//code to be executed  
}
```
Example:
{%replit @HeinKhantZaw/labeledForLoop %}

ဒီမှာဆိုရင် အပြင်ဘက်က i နဲ့ပတ်တဲ့ loop ကို aa လို့ label တပ်ထားပြီး အထဲက j နဲ့ပတ်တဲ့ loop ကိုတော့ bb ဆိုပြီး label တပ်ထားပါတယ်။ bb loop ထဲမှာ if(i==2 && j==2) ဆိုတဲ့ condition တစ်ခုစစ်ပြီး တကယ်လို့ condition ကိုက်ညီတယ်ဆိုရင် break aa; ဆိုပြီး aa loop ကို break လုပ်ထားပါတယ်။  break statement ဆိုတာကတော့ loop block တွေထဲမှာ အကြောင်းတစ်မျိုးမျိူးကြောင့် break statement ကိုရောက်ပြီဆိုတာနဲ့ လက်ရှိ loop ကနေ ထွက်ပေးနိုင်ပါတယ်။ အထက်ပါ example မှာဆိုရင် i နဲ့ j တန်ဖိုးနှစ်ခုစလုံး 2 နဲ့ညီသွားတဲ့အခါ aa loop ကို break statement နဲ့ရပ်လိုက်မှာဖြစ်ပါတယ်။ အဲ့တော့ output ထွက်တဲ့အခါ i = 1 မှာ j နဲ့ပတ်တဲ့ bb loop က သုံးကြိမ် အထိပတ်ပြီး i = 2 ဖြစ်တဲ့အချိန်မှာ bb loop ထဲမှာ j = 1 အထိပဲ output ထွက်မှာကို မြင်တွေ့ရပါလိမ့်မယ်။

For Loop တွေအကြောင်း ကတော့ ဒီမှာ ပြီးပါပြီ။

## While Loop
While Loop ကို ကျွန်တော်တို့ program ထဲက condition တစ်ခုဟာမှန်နေသရွေ့ ထပ်ကာထပ်ကာအလုပ်လုပ်စေလိုသောအခါ အသုံးပြုပါတယ်။ ပြီးတော့ ဒီ while loop ကို အကြိမ်အရေအတွက် အတိအကျမရှိတဲ့ loop တွေအတွက်အသုံးပြုကြတာ ဖြစ်ပါတယ်။ ပြီးတော့ဘယ်တော့မှမရပ်တဲ့ Loop တွေအတွက်လဲ အသုံးပြုနိုင်ပါတယ်။

Syntax:
```java
while(condition){
//code to be executed
}
```

Example:
{%replit @HeinKhantZaw/whileLoop %}

ဒီမှာ While Loop ကို တည်ဆောက်ဖို့အတွက် while ကိုရေးပြီး condition ထည့်ရပါတယ် သူ့ထဲက အခြေအနေ မှန်ကန်နေသရွေ့ ကျွန်တော်တို့ Loop က အလုပ်လုပ်နေအုန်းမှာပါ။ ဒါပေမယ့် ဒီမှာ for လို တစ်ခါထဲတည်ဆောက် လိုက်လို့မရဘူး။ `int i = 1` ဆိုတာ အရင်ဆုံးကြေညာပြီး while loop ထဲမှာ ဘယ်အောက်ငယ်တဲ့ အထိဆိုပြီး condition တစ်ခုသတ်မှတ်ပေးရတယ်။ အခု i<=5 ဆိုတော့ i က 5 နဲ့ညီတဲ့ အထိ loop ပတ်မယ်ဆိုပြီး ရေးလိုက်တာဖြစ်ပါတယ်။ပြီးတော့ တန်ဖိုးတိုးသွား မယ့် i ကို output ထုတ်ပါတယ် ပြီးတော့ counter တိုးဖို့ လျော့ဖို့အတွက် increment/decrement ကိုရေးဖို့လိုပါသေးတယ်။ ဒီတော့အောက်မှာ `i++;` ဆိုပြီးရေးပေးရပါတယ်။

### Infinite While Loop

Infinite While Loop ရဖို့က Condition နေရာမှာ true လုပ်ထားလိုက်ရုံပါပဲ။ အဲ့လိုသာရေးထားလိုက်မယ်ဆိုရင် ဘယ်တော့မှ while loop ထဲက ထွက်နိုင်မှာ မဟုတ်တော့ပါဘူး။
ထွက်ချင်ရင်တော့ ခုနက Infinite for Loop တုန်းကလိုပဲ Ctrl+c ကိုတွဲနှိပ်လိုက်ရုံပါပဲ။

Syntax:
```java
while (true) {
// code to be executed
}
```
Example:
{%replit @HeinKhantZaw/infiniteWhileLoop %}

## Do-While Loop
ဒီ Do-While Loop ကလည်း တခြား Loop တွေလိုဘဲ ထပ်ခါထပ်ခါလုပ်မယ့် လုပ်တွေ အတွက်သုံး နိုင် ပါတယ်။ဒါပေမယ့် တစ်ခုရှိတာကတော့ ကျွန်တော်တို့ ထပ်ခါထပ်ခါလုပ်ဖို့ အကြိမ်ရေအတိကျမရှိတဲ့အခါမျိုး နဲ့ condition မမှန်ကန်ခဲ့ရင်တောင် အနည်းဆုံးတစ်ခေါက်ကတော့ လုပ်ကိုလုပ်ရမယ်ဆိုတဲ့အခြေအနေမျိုးတွေအတွက် အသုံးပြုရပါတယ်။

Syntax:
```java
do{
//code to be executed
}while(condition);
```
သူ့ရဲ့ syntax တည်ဆောက်ပုံအရ condition စစ်ဆေးခြင်းက နောက်မှလာတာဖြစ်တဲ့ အတွက် condition စစ်ဆေးမှုက false ဖြစ်နေခဲ့ရင်တောင် loop က အနည်းဆုံး 1 ကြိမ်တော့အလုပ်လုပ်မှာပါ။
အရင်ဆုံး condition မှန်တဲ့ program တစ်ခုရေးပြီးနောက်မှ condition မှားတာတစ်ခုရေးကြပါမယ်။

{%replit @HeinKhantZaw/doWhileLoop %}

ဒီ program က i တန်ဖိုး 5 နဲ့မညီမချင်း အလုပ်လုပ်မယ့် program ဖြစ်ပါတယ်။ ဒါကတော့ခုနက while loop ပုံစံနဲ့အတူတူပဲဖြစ်ပါတယ်။

အခု ကျွန်တော်တို့ condition အမှားတစ်ခုရေးရအောင်။

{%replit @HeinKhantZaw/wrongDoWhile %}

ဒီမှာဆို condition စစ်ဆေးထားတာက i<=5 ဖြစ်ပါတယ်။ ဒါပေမယ့် အခု i တန်ဖိုးက စကြေညာတည်းက 6 ဖြစ်နေပြီဆိုတော့ ဘယ်လိုနည်းနဲ့မှ condition မမှန်တော့ပါဘူး။ ဒါပေမယ့် do block ထဲက code ကိုတော့ တစ်ကြိမ်အလုပ်လုပ်သွားတာတော့တွေ့ရမှာဖြစ်ပါတယ်။


ကဲ....ဒီလောက်ဆိုရင် loop ကောင်းကောင်းပတ်တတ်သွားပြီထင်ပါတယ်။ အဲ့တော့ ဒီ [link](http://www.beginwithjava.com/java/loops/questions.html) ထဲက loop နဲ့ ပတ်သက်တဲ့ exercise လေးတွေလုပ်ကြည့်ရင်ပိုပြီးနားလည်တတ်မြောက်သွားမယ်ထင်ပါတယ်။