August 12, 2012

Set Interface

Set အင်တာဖေစ်သည် ကော်လက်ရှင် တစ်မျိုးဖြစ်ပြီး၊ ပါဝင်သော Element များအား အမျိုးတူ Element အား တစ်ခုထက်ပို၍ လက်ခံနိုင်ခြင်း မရှိပါ။ ဥပမာအားဖြင့် Set set အထဲသို့ "Myanmar" ကို အကြိမ်ကြိမ် add လုပ် မည်ဆိုလျှင်လည်း ပြန်လည် ခေါ်ယူသောအခါ "Myanmar" တစ်ခုတည်းကိုသာ ရရှိမည် ဖြစ်ပါသည်။ Set အင်တာဖေစ်သည် သင်္ချာဘာသာရပ်၏ အခြေခံ အတွေးအခေါ်တစ်ခုဖြစ်သော Set အား မော်ဒယ်တစ်ခု အနေဖြင့် ကိုယ်စားပြုထားသော အင်တာဖေစ် ဖြစ်ပါသည်။

Setတွင်ပါဝင်သော လုပ်ဆောင်ချက်များသည် Collection တွင်ပါဝင်သော လုပ်ဆောင်ချက်များနှင့် ထပ်တူဖြစ်ပြီး၊ တားမြစ်ချက်အနေဖြင့် Element တစ်ခုအား ထပ်ခါတလည်းလည်း တည်ရှိနိုင်ခြင်း မရှိစေရန် တားမြစ် ထားပါသည်။ တဖန် Setအင်တာဖေစ်သည် equals နှင့် hashCode လုပ်ဆောင်ချက်နှင့် ပတ်သက်သော စီးကမ်းများကိုလည်း တင်းကျပ်စွာ ချမှတ်ထား၏။ အကဲ၍ မတူညီသော Implements Class များကို အသုံးပြုထားသော Set Instance များ အကြားတွင်ပင် နှိုင်းယှဉ်သောအခါ အဓိပ္ပါယ်ကို ကြည့်၍ နှိုင်းယှဉ်နိုင်ရန် စီမံထားပါသည်။ Set နှစ်ခုအား နှိုင်းယှဉ်ရာတွင် ပါဝင်သော Element များက တူညီပါက ထို Set နှစ်ခုသည် တူညီမည် ဖြစ်ပါသည်။

SetCompare.java
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class SetCompare {

 public static void main(String[] args) {
  
  Set<Integer> set1 = new HashSet<>();
  Set<Integer> set2 = new TreeSet<>();
  
  for(int i=0; i<10; i++) {
   set1.add(i);
   set2.add(i);
  }
  
  System.out.println(set1.hashCode());
  System.out.println(set2.hashCode());
  
  System.out.println(set1.equals(set2));
 }

}
အထက်ပါ နမှုနာ၏ စာကြောင်း ၉နှင့် ၁၀ တွင် Set အော့ဘဂျက် set1 နှင့် set2 တို့အား အသီးသီး HashSet နှင့် TreeSet တို့မှ new လုပ်ပြီး တည်ဆောက်ထားပါသည်။ ထို့နောက်တွင် for ဝါကျကို အသုံးပြုကာ အော့ဘဂျက် နှစ်ခုလုံးတွင် 0 မှ 9 အထိ Integer များအား ထည့်သွင်းပါသည်။ နောက်ဆုံး စာကြောင်း ၂၀ တွင် set1 နှင့် set2 တို့အား နှိုင်းယှဉ်ကြည့်နေပါသည်။ အဖြေမှာ အောက်ပါအတိုင်းဖြစ်ပါသည်။


set1 နှင့် set2 ဟာအသီးသီး HashSet နှင့် TreeSet တို့၏ Instance ဖြစ်သော်လည်း ပါဝင်သော Element များမှာ တူညီသောကြောင့် Hash Code မှာလည်း အတူတူဖြစ်ပြီး၊ equals ၏ ရလဒ်မှာလည်း တူညီကြောင်း တွေ့ရှိနိုင်ပါသည်။


General Implementations

Java Platform တွင် Set အင်တာဖေစ်အား အထွေထွေသုံးအနေဖြင့် ပံ့ပိုးထားသော ကလပ်စ် ၃မျိုးရှိပါသည်။
  • java.util.HashSet
    Element များအား သိမ်းဆည်းရာတွင် Hash Table ဖွဲ့စည်းပုံကို အသုံးပြုပါသည်။ Set ၏ General Purpose Implementation များအထဲတွင် Performance ပိုင်းဆိုင်ရာတွင် အကောင်းဆုံး Implementation ဖြစ်ပါသည်။ သို့ရာတွင် Iterator လုပ်တဲ့အခါမှာတော့ အစီအစဉ်အား တိကျမှု့ရှိစေမည်ဟု အာမှခံပေးထားနိုင်စွမ်း မရှိပေ။
  • java.util.TreeSet
    Red-Black Tree ဖွဲ့စည်းပုံကို အသုံးပြု၍ Element များအား သိမ်းဆည်းထားပါသည်။ Element များ၏ တန်ဖိုးအရ အစီအစဉ်ကို စောင့်တည်နိုင်မည် ဖြစ်သော်လည်း၊ Performance ပိုင်းဆိုင်ရာတွင် HasnSet ထက် အောက်ကျမည် ဖြစ်ပါသည်။
  • java.util.LinkedHashSet
    အမည်အတိုင်း Hash Table အား Link List နှင့် ပူးတွဲအသုံးပြု ထားသော Implementation တစ်မျိုး ဖြစ်ပါသည်။ တဖန် Insert လုပ်ထားသော အစီအစဉ်ကိုလည်း စောင့်ထိမ်းပေးနိုင်မှာ ဖြစ်ပါတယ်။
အသီးသီးရဲ့ ထူးခြားချက်ကို သိရှိနိုင်ရန် နမှုနာ တစ်ခုကို စမ်းသပ်ကြည့်ပါမည်။

SetImplementations.java
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

public class SetImplementations {

 public static void main(String[] args) {
  
  Set<Integer> hashSet = new HashSet<>();
  Set<Integer> treeSet = new TreeSet<>();
  Set<Integer> linkSet = new LinkedHashSet<>();
  
  for (int i=10; i > 0; i--) {
   hashSet.add(i);
   treeSet.add(i);
   linkSet.add(i);
  }
  
  System.out.println("HashSet       : " + hashSet);
  System.out.println("TreeSet       : " + treeSet);
  System.out.println("LinkedHashSet : " + linkSet);
 }

}
အထက်ပါ နမှုနာတွင် Set ၏ Implementations များဖြစ်ကြသော HashSet, TreeSet နှင့် LinkedHashSet တို့အား အသီးသီး အသုံးပြုထားပါသည်။ အဆိုပါ set Object အသီးသီးတွင် For ဝါကျအား အသုံးပြု၍ 10 မှ 1 အထိ ကိန်းများကို ဖြည့်စွက်စေပါသည်။ နောက်ဆုံးတွင် အသီးသီး Console တွင် ဖော်ပြနေစေခြင်း ဖြစ်၏။ ရလဒ်မှာ အောက်ပါအတိုင်း ဖြစ်ပါသည်။


ဤနေရာတွင် HashSet နှင့် TreeSet တို့မှာ တန်ဖိုးအတိုင်း စီစဉ်ထားသကဲ့သို့မြင်ရ၏။ သို့ရာတွင် HashSet မှာမူ အစီအစဉ်ကို အာမခံထားခြင်း မရှိသောကြောင့် အစီအစဉ်ကို လိုအပ်သောအခါ အသုံးပြုရန် မသင့်တော်ပေ။ တဖန် LinkedHashSet မှာမူ Insert လုပ်ထားသည့် အစီအစဉ် အတိုင်း ဖော်ပြပေးနိုင်သည်ကို တွေ့ရပါသည်။

ဤသည်ကိုကြည့်ခြင်းအားဖြင့်၊ Duplicate မဖြစ်သော အချက်အလက်များအား အသုံးပြုလိုပါက Performance အကောင်းဆုံးဖြစ်သော HashSet အား အသုံးပြုသင့်ပြီး၊ တန်ဖိုးအတိုင်း အစီအစဉ်ကို အသုံးပြုလိုပါက TreeSet ကို အသုံးပြုသင့်ပြီး၊ Insert လုပ်ထားသည့် Order ကို အသုံးပြုလိုပါက LinkedHashSet ကို အသုံးပြုသင့်သည်ကို သိရှိနိုင်ပါသည်။


နမှုနာ ပုဒ်စာ

အောက်ပါစာရင်းမှ ကုန်ပစ္စည်း များအား နာမည်အတိုင်း စီစဉ်ပေးပါ။ တဖန် အမည်တူများအား တစ်ကြိမ်ထပ်ပို၍ ဖော်ပြခြင်း မရှိစေရန် စီမံပါ။

[i phone 4s,pencil,ball pen,pen,book,pencil,note book,book,android,i phone 3,i phone 3s,i phone 4s]

SetSample.java
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;

public class SetSample {

 static String DATA_LIST = "i phone 4s,pencil,ball pen,pen,book," +
   "pencil,note book,book,android,i phone 3,i phone 3s,i phone 4s";

 public static void main(String[] args) {
  Set<String> treeSet = new TreeSet<>(Arrays.asList(DATA_LIST.split(",")));
  System.out.println(treeSet);
 }

}
အထက်ပါ ပရိုဂရမ်အား ကွန်ပိုင်းလုပ်၍ အလုပ်ခိုင်းကြည့်ပါက အောက်ပါအတိုင်း အဖြေရရှိမည် ဖြစ်ပါသည်။

[android, ball pen, book, i phone 3, i phone 3s, i phone 4s, note book, pen, pencil]

ဆက်ပါဦးမည်။


ကိုးကား
http://docs.oracle.com/javase/tutorial/collections/interfaces/set.html

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

No comments:

Post a Comment