August 15, 2012

List Interface

Easy Java API အခန်းဆက်ကို ရေးသားလာခဲ့သည်မှာ ၄ ခန်းမြောက်ကို ရောက်ရှိခဲ့ပြီ ဖြစ်၏။ အစဦးဆုံးတွင် Collection Framework အကြောင်း၊ ဒုတိယ အခန်းဖြင့် Collection Interface အကြောင်း၊ ပြီးခဲ့တဲ့ တစ်ခေါက်ကတော့ Set Interface အကြောင်းကို ဖော်ပြခဲ့၏။ ယခုတစ်ခေါက်တွင်လည်း Collection Framework ၏ အခြေခံ Interface တစ်ခု ဖြစ်သော List Interface အကြောင်းကို ဖော်ပြသွားပါဦးမည်။


List Interface

List Interface သည် Collection Interface ၏ Sub Interface တစ်ခု ဖြစ်ပြီး၊ Element များရဲ့ အစီအစဉ်ကို သိမ်းဆည်း ဖော်ပြပေးနိုင်မှာ ဖြစ်ပြီး Sequence လို့လည်း ခေါ်ဆိုလေ့ရှိ၏။ Set Interface နဲ့ မတူပဲ List Interface ဟာ Duplicate Element များကိုလည်း သိမ်းဆည်းထားနိုင်မှာ ဖြစ်ပါတယ်။ Collection Interface ရဲ့ လုပ်ဆောင်ချက်များအပြင် ပါဝင်သော လုပ်ဆောင်ချက်များမှာ အောက်ပါအတိုင်းဖြစ်၏။

List.java
public interface List<E> extends Collection<E> {
    // Positional access
    E get(int index);
    // optional
    E set(int index, E element);
    // optional
    boolean add(E element); 
    // optional
    void add(int index, E element);
    // optional
    E remove(int index);
    // optional
    boolean addAll(int index, Collection<? extends E> c);

    // Search
    int indexOf(Object o);
    int lastIndexOf(Object o);

    // Iteration
    ListIterator<E> listIterator();
    ListIterator<E> listIterator(int index);

    // Range-view
    List<E> subList(int from, int to);
}
  • Positional Access
    လစ်အတွင်းတွင်ပါဝင်သော Element များအား အစီအစဉ် နံပါတ်ဖြင့် ဆက်သွယ်နိုင်သော လုပ်ဆောင်ချက်များ
  • Search
    လစ်အတွင်းတွင်ပါဝင်သော Object ဖြင့် ၎င်း၏ အစီအစဉ် နံပါတ်အား သိရှိစေနိုင်သော လုပ်ဆောင်ချက်များ
  • Iteration
    Iterator အဖြစ် ပြောင်းလည်း အသုံးပြုနိုင်သော လုပ်ဆောင်ချက်များ
  • Range-View
    လစ်အတွင်းရှိ Element များအား အစနံပါတ်နှင့် အဆုံးနံပါတ်ကိုပေးကာ အပိုင်းပိုင်းဖြတ် ရယူနိုင်သော လုပ်ဆောင်ချက်များ


Implementation Classများ

Java Platform တွင် List အား Implement လုပ်ထားသော General Purpose Implementation Class နှစ်မျိုးရှိပြီး၊ ၎င်းတို့မှာ ArrayList နှင့် LinkedList တို့ပဲ ဖြစ်ကြ၏။ ArrayList သည် Performance ဘက်တွင် ကောင်းမွန်သောကြောင့် အသုံးများပြီး၊ LinkedList ဟာလည်း အချို့သော နေရာများတွင် Performance ပိုမို ကောင်းမွန်၏။ ထို့အပြင် ယခင်ရှိခဲ့ပြီး ဖြစ်သော Vector Class သည်လည်း List Interface အား Implement လုပ်လာခဲ့၏။


Vector နှင့် နှိုင်းယှဉ်ခြင်း

အကယ်၍ Vector ကလပ်စ်အား ယခင်က အသုံးပြုခဲ့ဘူးပါက၊ List Interface ၏ အခြေခံ အသုံးပြုပုံများအား ရင်းနှီးပြီး ဖြစ်ပါလိမ့်မည်။ List သည် Vector ၏ မိုင်နာ လိုအပ်ချက် အချို့ကို ပြုပြင်ထားခြင်းဖြစ်၏။ Vector၏ အသုံးများသော လုပ်ဆောင်ချက်များ ဖြစ်ကြသည့် setElementAt နှင့် elementAt များအား၊ ပို၍တိုသော အမည် ဖြင့် ပြောင်းလည်းထားသည်ကို တွေ့ရ၏။ ပရိုဂရမ် ရေးသည့်အခါတွင် မလိုအပ်ပဲ ရှည်လျားနေခြင်းထက်၊ လိုရင်းတိုရှင်းက ပို၍နားလည်လွယ်မည် ဖြစ်ပေသည်။

// Array ဖြင့်ရေးသားထားခြင်း
a[i] = a[j].times(a[k]);

// Vector ကို သုံးမည်ဆိုပါက
v.setElementAt(v.elementAt(j).times(v.elementAt(k)), i);

// List အား အသုံးပြုခြင်း
l.set(i, l.get(j).times(l.get(k)));
Vector အား အသုံးပြုသည်နှင့် စာလျှင် List အား အသုံးပြုသည်က ပို၍ ရှင်းလင်းသည်ကို တွေ့ရမည် ဖြစ်သည်။

ထို့အပြင် ကော်လက်ရှင်၏ အစိတ်အပိုင်းတစ်ခုကို ဖော်ပြပေးသော လုပ်ဆောင်ချက်ဘက်မှာလည်း Vector ၏ indextOf, lasIndexOf နှင့် setSize လုပ်ဆောင်ချက် ၃ခုအား subList လုပ်ဆောင်ချက်ဖြင့် အစားထိုး ထားပါသည်။


ArrayList နှင့် LinkedList

အတော်များများ Java ပရိုဂရမ်မာများသည် List ၏ Implementation Class အား အသုံးပြုရာတွင် ArrayList အား အသုံးပြုသည်က များကြပါသည်။ အကြောင်း တစ်ခုတွင် ArrayList သည် များသောအားဖြင့် Performance ပိုင်းဆိုင်ရာတွင် ကောင်းမွန်သည်မှာ မှန်၏။ ထိုအထဲတွင် ArrayList ကို အသုံးများသောကြောင့်၊ LinkList အား မသိသောကြောင့် အစရှိသည့် အကြောင်းပြချက်များလည်း ရှိကြမည်ဖြစ်သည်။

ဒီလိုဆိုရင် ArrayList နှင့် LinkedList သည် မည်သို့ကွာခြားမည်နည်း။ အမည်အရ ArrayList သည် Data ဖွဲ့စည်းပုံအား Array အားအသုံးပြု၍၊ Array ၏ Size အား Dynamically တိုးပေးနိုင်စွမ်းရှိ၏။



တဖက် LinkList သည် Data ဖွဲ့စည်းပုံအား Linked List ဖွဲ့စည်းပုံအပေါ် အခြေခံထား၏။ Link List Data ဖွဲ့စည်းပုံဆိုသည်မှာ Data အစုအစည်းအား အစဉ်လိုက်သက်မှတ်ထားပြီး၊ Data တစ်ခုမှ မိမိ၏ နောက်တွင်ရှိသော Data တစ်ခုအား Reference လုပ်နိုင်ရန် စီစဉ်ထားသော ဖွဲ့စည်းပုံမျိုး ဖြစ်၏။

Linked List Structure
ဤကဲ့သို့ အခြေခံ ဖွဲ့စည်းပုံမှာ မတူညီသောကြောင့်၊ အားနည်းချက် အားသာချက်များမှာလည်း မတူညီနိုင်ပေ။
  • ArrayList ဟာ Array ပုံစံကို အခြေခံထားပါသဖြင့် index တစ်ခုဖြင့် အချက်အလက်များအား ရှာဖွေတဲ့ နေရာမှာ ထူးချွံပါတယ်။ နံပါတ်တစ်ခုပေးပြီး လစ်ထဲမှ အချက်အလက်များကို ရယူတဲ့အခါမျိုးမှာ ArrayList ရဲ့  Performance ဟာ ကောင်းမွန်၏။
  • သို့ရာတွင် List အတွင်းသို့ Add လုပ်သည့်အခါတွင် Array ဖြစ်သောကြောင့်၊ Size ကို ပြန်စီစဉ်ရခြင်း အစရှိသည်တို့ကို လုပ်ဆောင်ရန်လိုအပ်ပါသဖြင့်၊ LinkList က ပို၍ ထူးချွံပါသည်။
  • အလားတူစွာပင် remove လုပ်သည့်အခါတွင်လည်း LinkList က reference ကို ပြုပြင်ရုံသာဖြစ်သဖြင့်၊ ArrayList ထက်ပို၍ Performance ကောင်းပါသည်။
  • Memory အသုံးဘက်က ကြီးမည်ဆိုပါက Index များဖြင့်သာ သတ်မှတ်ထားသော ArrayList သည်၊ တစ်ခုချင်း Reference လုပ်သိမ်းနေရပြီး Overhead များနေတတ်သော LinkList ထက်စာလျှင် ပိုမို သက်သာပါသည်။
အထက်ပါ အားနည်းချက်၊ အားသာချက်များအားကြည့်ခြင်းဖြင့် LinkList အား မည်သည့်အခါမျိုးတွင် သုံးသင့်ကြောင်းကို တွေ့မြင်လာမည် ဖြစ်သည်။


List Algorithms

Collection Framework အတွင်းတွင် List အား အသုံးပြုနိုင်သော အလဂိုရီဇင်များအား Collections ကလပ်စ် မှတဆင့် ပံ့ပိုးထားပါသည်။

အမည် ရှင်းလင်းချက်
sort Merge Sort Algorithm ကို အသုံးပြုထားပြီး၊ လျှင်မြန်စွာ၊ Stable ဖြစ်စွာ Sort လုပ်ပေးနိုင်ပါသည်။
shuffle List အတွင်းရှိ Element များအား အစီအစဉ်အတိအကျမရှိ(Randomly) ပြန်လည် စီစဉ်ပေးနိုင်ပါသည်။
reverse List အတွင်းရှိ Element များ၏ အစီအစဉ်အား ပြောင်းပြန် စီစဉ်ပေးနိုင်ပါသည်။
rotate List အတွင်းရှိ Element များအား သတ်မှတ်ထားသော အကွာအဝေး တစ်ခု အထိ Rotate လုပ်ပေးနိုင်မည် ဖြစ်သည်။
replaceAll List အတွင်းရှိ တန်ဖိုးတစ်ခုနှင့် တူညီသော Element များအား အခြားသော တန်ဖိုးဖြင့် အစားထိုးပေးနိုင်မည် ဖြစ်သည်။
fill List အတွင်းရှိ Element များအား တန်ဖိုးတစ်ခုဖြင့် Override လုပ်နိုင်မည် ဖြစ်သည်။
copy List တစ်ခုအား အခြားသော List တစ်ခု အဖြစ် ကော်ပီကူးပေးနိုင်မည် ဖြစ်သည်။
binarySearch List အတွင်းမှ Element တစ်ခုအား Binary Search Algorithm အား အသုံးပြု၍ ရှာဖွေနိုင်မည် ဖြစ်သည်။
indexOfSublist မှုရင်း List အတွင်းမှ Sub List တစ်ခု၏ အစနေရာအား ရှာဖွေရာတွင် အသုံးပြုနိုင်မည် ဖြစ်သည်။ အစနေရာအား ရှာဖွေမတွေ့ရှိပါက -1 ကို return လုပ်မည် ဖြစ်သည်။
lastIndexOfSublist မှုရင်း List အတွင်းမှ နောက်ဆုံးတွေ့ရမည် ဖြစ်သော Sub List တစ်ခု၏ အစနေရာအား ရှာဖွေရာတွင် အသုံးပြုနိုင်မည် ဖြစ်သည်။ အစနေရာအား ရှာဖွေမတွေ့ရှိပါက -1 ကို return လုပ်မည် ဖြစ်သည်။

ကိုးကား
http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html
http://en.wikipedia.org/wiki/Linked_list
http://javarevisited.blogspot.jp/2012/02/difference-between-linkedlist-vs.html

ဆက်ပါဦးမည်။ လေးစားစွာဖြင့်။
မင်းလွင် 

No comments:

Post a Comment