September 23, 2012

Map

Map အင်တာဖေစ်သည် Collection Framework တွင်ပါဝင်သော အင်တာဖေစ် တစ်မျိုးဖြစ်ပြီး၊ ၎င်း၏ Object များသည်၊ ကီး (key) နှင့် တန်ဖိုး (value) အား တွဲ၍ သိမ်းဆည်းထားနိုင်ပါသည်။ Map အတွင်းတွင် ကီးတစ်ခု၌ တန်ဖိုး နှစ်ခုအား သိမ်းဆည်း၍ မရနိုင်ပါ။ Map သည် သင်္ချာဘာသာရပ်တွင် ပါဝင်သော Function Abstraction အား ကိုယ်စားပြုထားသော အင်တာဖေစ် တစ်မျိုးဖြစ်ပါသည်။

Map.java
public interface Map<K,V> {

    // Basic operations
    V put(K key, V value);
    V get(Object key);
    V remove(Object key);
    boolean containsKey(Object key);
    boolean containsValue(Object value);
    int size();
    boolean isEmpty();

    // Bulk operations
    void putAll(Map<? extends K, ? extends V> m);
    void clear();

    // Collection Views
    public Set<K> keySet();
    public Collection<V> values();
    public Set<Map.Entry<K,V>> entrySet();

    // Interface for entrySet elements
    public interface Entry {
        K getKey();
        V getValue();
        V setValue(V value);
    }
}

လက်ရှိ Java Platform တွင် General Purpose implementations များမှာ အောက်ပါအတိုင်း ဖြစ်ကြ၏။
  • HashMap
    Hash Table ဖွဲ့စည်းပုံကို အသုံးပြုပါသည်။ Set ၏ General Purpose Implementation များအထဲတွင် Performance ပိုင်းဆိုင်ရာတွင် အကောင်းဆုံး Implementation ဖြစ်ပါသည်။ သို့ရာတွင် Iterator လုပ်တဲ့အခါမှာတော့ အစီအစဉ်အား တိကျမှု့ရှိစေမည်ဟု အာမှခံပေးထားနိုင်စွမ်း မရှိပေ။
  • TreeMap
    Red-Black Tree ဖွဲ့စည်းပုံကို အသုံးပြု၍ Element များအား သိမ်းဆည်းထားပါသည်။ key များအား အစီအစဉ်အလိုက် သိမ်းဆည်းနိုင်မည် ဖြစ်သော်လည်း၊ Performance ပိုင်းဆိုင်ရာတွင် HasnMap ထက် အားနည်းမည် ဖြစ်ပါသည်။
  • LinkedHashMap
    အမည်အတိုင်း Hash Table အား Link List နှင့် ပူးတွဲအသုံးပြု ထားသော Implementation တစ်မျိုး ဖြစ်ပါသည်။ တဖန် Insert လုပ်ထားသော အစီအစဉ်ကိုလည်း စောင့်ထိမ်းပေးနိုင်မည် ဖြစ်သည်။
  • HashTable
    Collections Framework မပေါ်ခင်ကတည်းက တည်ရှိခဲ့သော Class တစ်ခုဖြစ်ပြီး၊ နောက်ပိုင်းတွင် Map Interface အား ပြန်လည်၍ Implement လုပ်ထားပါသည်။


HashTable နှင့် ကွာခြားချက်များ


ယခင် HashTable အား အသုံးပြုဘူးသူ ဖြစ်ပါက Map Interface ၏ အခြေခံ လုပ်ဆောင်ချက်များအား ရင်းနှီးပြီး ဖြစ်ပါလိမ့်မည်။ သို့ရာတွင် HashTable နှင့် ကွာခြားချက်တို့မှာ အခြေခံအားဖြင့် အောက်ပါအတိုင်း အချက်သုံးမျိုး ရှိပါသည်။
  • Map Interface သည် တန်ဖိုးများအား အကြိမ်ကြိမ် အလုပ်လုပ်စေရာတွင် Enumeration Objectအား အသုံးပြုသည့်အစား Collection View အား အသုံးပြုထားပါသည်။
  • Map အား အသုံးပြုခြင်းအားဖြင့် အချက်အလက်များအား အကြိမ်ကြိမ်အသုံးပြုစေရာတွင် Key အပေါ်တွင်၎င်း၊ Value အပေါ်တွင်၎င်း၊ Key-Value အပေါ်တွင်၎င်း အခြေပြု၍ အသုံးပြုနိုင်သည်။ HashTable သည် Key-Value အပေါ်ရှိ Iteration အား ပံ့ပိုးပေးနိုင်ခြင်းမရှိပါ။
  • Map အား အသုံးပြုခြင်း အားဖြင့် Iteration လုပ်နေစဉ်မှာလည်း Entries များအား လုံခြုံစိတ်ချစွာ ဖြတ်ထုတ်နိုင်ပါသည်။ HashTable မှာတော့ ဤကဲ့သို့ပြုလုပ်နိုင်ခြင်း မရှိပါ။
Map တွင် HashTable ၏ အချို့သော အသေးစား အစဉ်မပြေမှု့များကိုလည်း ပြုပြင်ထားပါသည်။ HashTable တွင် HashTable#contains လုပ်ဆောင်ချက်ကို ပိုင်ဆိုင်ပြီး၊ ၎င်းသည် ပါရာမီတာသည် တဖိုးအတွင်းတွင် ပါဝင်ပါက true ကို ရလဒ်အဖြစ် ရရှိမည်ဖြစ်ပြီး၊ သို့မဟုတ်ပါက ရလဒ်သည် false ဖြစ်မည် ဖြစ်သည်။ သို့ရာတွင် အမည်အရ အသုံးပြုသူသည် ပါရာမီတာသိ ကီးများအတွင်းတွင်ပါဝင်ပါက true သို့မဟုတ်ပါက false ကိုပြန်ရမည် ဟု ထင်ကောင်းထင်ပါလိမ့်မည်။ အဘယ်ကြောင့်ဆိုသော် HashTable သည် Key များအား အခြေခံအနေဖြင့် သိမ်းဆည်းလေ့ ရှိသောကြောင့် ဖြစ်သည်။ Map အရောက်တွင် အထက်ပါကဲ့သို့ ရေရာခြင်းမရှိသော အမည်များအား ပြုပြင်ပြီး၊ Map#containsKey နှင့် Map#containsValue ကို အသုံးပြုထားပါသည်။



လုပ်ဆောင်ချက်များ


ရလဒ် အမည် ရှင်းလင်းချက်
V put ပါရာမီတာအဖြစ် ကီးနှင့် တန်ဖိုးကိုရယူမည်ဖြစ်ပြီး၊ရယူထားသော ကီးနှင့် တန်ဖိုးအားပူတွဲ၍ သိမ်းဆည်းထားနိုင်မည် ဖြစ်သည်။
V get ပါရာမီတာ အဖြစ်ကီးအား ရယူမည် ဖြစ်ပြီး၊ ကီးနှင့်တွဲ၍ သိမ်းဆည်းထားသော တန်ဖိုး Object အား ရလဒ်အဖြစ်ပြန်လည် ရရှိမည် ဖြစ်သည်။
V remove ပါရာမီတာ ဖြင့်ရယူထားသော ကီးသည် Entery အနေဖြင့် သိမ်းဆည်းထားပါက ကီးနှင့် တန်ဖိုးအား ဖြတ်ထုတ်နိုင်မည် ဖြစ်သည်။
boolean containsKey ပါရာမီတာကီးသည် ကီးများအတွင်းတွင်ပါဝင်ပါက true အားရရှိမည် ဖြစ်ပြီး၊ သို့မဟုတ်ပါက false အား ရရှိမည် ဖြစ်သည်။
boolean containsValue ပါရာမီတာတန်ဖိုးသည် တန်ဖိုးများအတွင်းတွင်ပါဝင်ပါက true အားရရှိမည် ဖြစ်ပြီး၊ သို့မဟုတ်ပါက false အား ရရှိမည် ဖြစ်သည်။
int size Map အတွင်းတွင်ပါဝင်သော Entry များ၏အရေအတွက်ကို ရရှိမည် ဖြစ်သည်။
boolean isEmpty Map သည် Empty ဖြစ်ပါက true ကို ရရှိမည် ဖြစ်ပြီး၊ သို့မဟုတ်ပါက false ကို ရရှိမည် ဖြစ်သည်။
void putAll ပါရာမီတာ အဖြစ်ရယူထားသော Map တစ်ခုအားလက်ရှိ Map Object အတွင်းသို့ ထည့်သွင်းနိုင်မည် ဖြစ်ပါသည်။
void clear Mapအတွင်းတွင်ရှိသော Entry များအားဖျက်ပြစ်နိုင်မည် ဖြစ်ပါသည်။
Set<K> keySet Map အတွင်းရှိ ကီးများအား Set ပုံစံဖြင့် ရရှိနိုင်မည် ဖြစ်သည်။
Collection<V> values Mapအတွင်းရှိ တန်ဖိုးများအား Collection ပုံစံဖြင့် ရရှိနိုင်မည် ဖြစ်သည်။
Set<Map.Entry<K,V>> entrySet Mapအတွင်းရှိ ကီးနှင့် တန်ဖိုး (Entry) အတွဲအား Set ပုံစံဖြင့် ရရှိမည် ဖြစ်ပါသည်။


နမှုနာ


ကျွှန်တော်တို့ Map အား Java ပရိုဂရမ်များရေးသားရာတွင် အကြိမ်ကြိမ် အသုံးပြုနိုင်မည် ဖြစ်သည်။ Database များအတွင်းရှိ တန်ဖိုးများအား ဆက်သွယ်ရာတွင်၎င်း၊ အပလီကေးရှင်းတစ်ခုနှင့် တစ်ခုကြား အချက်အလက်များကို ဆက်သွယ်ရာတွင်၎င်း၊ Web အပလီကေးရှင်းများဆိုပါက Client ဆီမှ Request လုပ်လာသော အချက်အလက်များအား ရယူရာတွင်၎င်း Map Object အား အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။

Map များအား အသုံးပြုရာတွင် သမရိုးကျ အချက်အလက်များအား သိမ်းဆည်းသော Container အဖြစ်အသုံးပြုရုံမက၊ Collections Framework ၏ သဘောတရားအား နားလည်ပြီး ပံ့ပိုးထားသော အလဂိုရီဇင်များကိုပါ အသုံးပြုနိုင်ကြောင်းကို သိရှိနိုင်ပေသည်။

ကျွှန်တော်တို့ ဤနေရာတွင် HashMap နှင့် TreeMap တို့အား အသုံးပြု၍ ၎င်းတို့၏ ခြားနားချက်များကို လေ့လာကြည့်ပါမည်။

MapSample.java
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

public class MapSample {

 public static void main(String[] args) {
  String [] array = {"1","2","3","11","12","13"};
  Map<String, String> hashMap = new HashMap<>();
  
  for(String s : array) {
   hashMap.put(s, s + "_value"); 
  }
  
  Map<String, String> treeMap = new TreeMap<>(hashMap);

  Map<Integer, String> treeMap2 = new TreeMap<>();
  Iterator<Entry<String, String>> itr = hashMap.entrySet().iterator();
  while(itr.hasNext()) {
   Entry<String, String> ent = itr.next();
   treeMap2.put(Integer.parseInt(ent.getKey()), ent.getValue());
  }
  
  System.out.println(hashMap);
  System.out.println(treeMap);
  System.out.println(treeMap2);

 }

}
ကျွှန်တော်တို့ ဤနမှုနာတွင် Integer နှင့် String တို့၏ စာစီပုံကို ကြည့်လိုပါသဖြင့်၊ အသုံးပြုမည့် ကိန်းစဉ် array အတွင်းတွင် 1,2,3,11,12,13ကို ပြင်ဆင်ထားပါသည်။ ပြီးလျှင် ထိုကိန်းစဉ်အတွင်းမှ အချက်အလက်များကို တစ်ခုချင်း hashMap အတွင်းသို့ ဖြည့်စွက်ပါသည်။

ပြီးပါက ထို hashMap ဖြင့် treeMap အား ပြုလုပ်ပါသည်။ နောက်ဆုံးတွင် HashMap အတွင်းမှ Entry များအား ထုတ်၍ ကီးအား Integer ပုံစံပြောင်းကာ treeMap2 အတွင်းသို့ ဖြည့်စွက် သိမ်းဆည်းပါသည်။ နောက်ဆုံးတွင် အထက်ပါ hashMap, treeMap နှင့် treeMap2တို့အား ကွန်ဆိုးတွင် ရေးသားနေစေခြင်း သာဖြစ်သည်။


HashMap ကို သုံးထားသော hashMap သည် အစီအစဉ်ကို သိမ်းမထားပါ၊ တဖန် treeMap သည် TreeMap<String, String> ဖြစ်သောကြောင့် String စာစီပုံအတိုင်း ကီးများကို စီစဉ်ပေးကြောင်း တွေ့ရပါသည်။ နောက်ဆုံး treeMap2 ၏ ကီးမှာ Integer ဖြစ်သောကြောင့် Integer အစီအစဉ်အတိုင်း ကီးများအား 1,2,3,11,12,13 ဟု စီပေးနိုင်ကြောင်းကို တွေ့ရမည်ဖြစ်သည်။

ကျွှန်တော်သည် Easy Java API ခေါင်းစဉ်ဖြင့် Collections Framework အကြောင်းကို မိတ်ဆက်ခဲ့ပါသည်။ Collections Framework နှင့် ၎င်းတွင်ပါဝင်သော Interface များအကြောင်း၊ General Purpose Implementation ကလပ်စ်များကို နမှုနာများအား ရေးသားပြီးဖော်ပြခဲ့ပြီးဖြစ်၏။ Collections Framework နဲ့ ပတ်သက်ပြီး ဤနေရာတွင် ရပ်နားမည် ဖြစ်ပြီး၊ အခြားသော အသုံးဝင်သည့် API များကိုလည်း ဤခေါင်းစဉ် အောက်တွင် ဆက်လက် ဖော်ပြသွားပါဦးမည်။

ကိုးကား

http://docs.oracle.com/javase/tutorial/collections/interfaces/map.html

လေးစားစွာဖြင့်
မင်းလွင်

No comments:

Post a Comment