JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ HashSet
渚古河
سطح
Москва

جاوا ۾ HashSet

گروپ ۾ شايع ٿيل
ڪلاس HashSetانٽرفيس کي لاڳو ڪري ٿو Set، هيش ٽيبل تي ٻڌل آهي، ۽ پڻ هڪ مثال جي پٺڀرائي آهي HashMap. جيئن ته HashSetعناصر آرڊر نه ڪيا ويا آهن، اتي ڪا به ضمانت نه آهي ته عناصر ڪجهه وقت کان پوء ساڳئي ترتيب ۾ هوندا. شامل ڪرڻ، ختم ڪرڻ ۽ ڳولهڻ جا عمل مسلسل وقت ۾ ڪيا ويندا، بشرطيڪ ته هيش فنڪشن عناصر کي صحيح طور تي "بالٽ" ۾ ورهائي، جنهن تي بعد ۾ بحث ڪيو ويندو. HashSet جاوا ۾ - 1بابت ڪجھ اهم نقطا HashSet:
  • ڇاڪاڻ ته ڪلاس انٽرفيس کي لاڳو ڪري ٿو Set، اهو صرف منفرد قدرن کي محفوظ ڪري سگهي ٿو؛
  • NULL قدرن کي ذخيرو ڪري سگھي ٿو؛
  • ترتيب جنهن ۾ عناصر شامل ڪيا ويا آهن حساب ڪيو ويو آهي هيش ڪوڊ استعمال ڪندي؛
  • HashSetپڻ لاڳو ڪري ٿو Serializable۽ Cloneable.
عملن جي مسلسل عمل جي وقت کي برقرار رکڻ لاء، وقت سان گڏ ڪمن تي خرچ ڪيو ويو HashSet، سڌو سنئون متناسب هجڻ گهرجي عناصر جي تعداد ۾ HashSet+ "ظرفيت" جي تعمير ٿيل مثال HashMap("ٽوڪرين جو تعداد"). تنهن ڪري، ڪارڪردگي کي برقرار رکڻ لاء، اهو ضروري آهي ته ابتدائي گنجائش تمام گهڻي (يا لوڊ عنصر تمام گهٽ) مقرر نه ڪيو وڃي. شروعاتي گنجائش - هيش ٽيبل ۾ سيلز جو شروعاتي نمبر ("bins"). جيڪڏھن سڀ سيل ڀريا وڃن، انھن جو تعداد پاڻمرادو وڌندو. لوڊ فيڪٽر هڪ ماپ آهي ته اهو ڪيئن مڪمل ٿي سگهي ٿو HashSetان کان اڳ ان جي گنجائش خودڪار طور تي وڌي وڃي. جڏهن عنصرن جو تعداد HashSetابتدائي ظرفيت ۽ لوڊ فيڪٽر جي پيداوار کان وڌيڪ ٿي وڃي ٿو، ته هيش ٽيبل کي ٻيهر هٽايو ويندو آهي (عناصر جا هيش ڪوڊ ٻيهر ڳڻيا ويندا آهن ۽ ٽيبل کي حاصل ڪيل قدرن جي مطابق ٻيهر ٺاهيو ويندو آهي) ۽ انگ ان ۾ سيلن جو تعداد ٻيڻو ٿي ويو آهي. لوڊ فيڪٽر = جدول ۾ ذخيرو ٿيل عناصر جو تعداد / هيش ٽيبل جي سائيز مثال طور، جيڪڏهن ٽيبل ۾ سيلز جو شروعاتي تعداد 16 آهي، ۽ لوڊ فيڪٽر 0.75 آهي، پوء اهو ان ڪري ٿو ته جڏهن ڀريل سيلن جو تعداد 12 تائين پهچي ٿو، سيلن جو تعداد خود بخود وڌي ويندو. لوڊ فيڪٽر ۽ شروعاتي گنجائش ٻه مکيه عنصر آهن جيڪي ڪارڪردگي تي اثر انداز ڪن ٿا HashSet. 0.75 جو هڪ لوڊ فيڪٽر سراسري طور تي سٺي ڪارڪردگي فراهم ڪري ٿو. جيڪڏهن هي پيٽرول وڌايو وڃي ٿو، ته پوء ميموري لوڊ گهٽجي ويندي (جيئن ته اهو ٻيهر هش ۽ ٻيهر تعمير جو تعداد گهٽائيندو)، پر اهو متاثر ٿيندو ضميمه ۽ ڏسڻ جي عملن کي. ٻيهر هٽائڻ تي خرچ ٿيل وقت کي گھٽائڻ لاءِ، توهان کي صحيح شروعاتي ظرفيت جي ماپ کي چونڊڻ جي ضرورت آهي. جيڪڏهن ابتدائي گنجائش لوڊ فيڪٽر طرفان ورهايل عناصر جي وڌ ۾ وڌ تعداد کان وڌيڪ آهي، ته پوءِ ٻيهر هيشنگ آپريشن نه ٿيندو. اهم: HashSetڊيٽا جو ڍانچو نه آھي بلٽ ان سنڪرونائيزيشن سان، پوءِ جيڪڏھن ان تي ھڪ ئي وقت گھڻا سلسلا ڪم ڪري رھيا آھن، ۽ انھن مان گھٽ ۾ گھٽ ھڪڙو تبديلي ڪرڻ جي ڪوشش ڪري رھيو آھي، ان لاءِ ضروري آھي ته ٻاھر کان هم وقت سازي جي رسائي مهيا ڪئي وڃي. اهو اڪثر ڪري ڪنهن ٻئي هم وقت سازي اعتراض جي خرچ تي ڪيو ويندو آهي HashSet. جيڪڏهن ڪو اهڙو اعتراض نه آهي، ته پوء Collections.synchronizedSet(). هي في الحال بهترين طريقو آهي جنهن سان هم وقت سازي جي عملن کي روڪڻ لاءِ HashSet.
Set s = Collections.synchronizedSet(new HashSet(...));
HashSet تعمير ڪندڙ:
  1. HashSet h = new HashSet(); - ڊفالٽ ٺاھيندڙ. ڊفالٽ شروعاتي گنجائش 16 آهي، لوڊ فيڪٽر 0.75 آهي.
  2. HashSet h = new HashSet(int initialCapacity)- ھڪڙي ٺاھيندڙ ھڪڙي شروعاتي صلاحيت سان. لوڊ فيڪٽر - 0.75.
  3. HashSet h = new HashSet(int initialCapacity, float loadFactor);- ھڪڙي ٺاھيندڙ ھڪڙي ابتدائي گنجائش ۽ لوڊ فيڪٽر سان.
  4. HashSet h = new HashSet(Collection C)- ھڪڙو ٺاھيندڙ جيڪو ٻئي مجموعن مان عناصر شامل ڪري ٿو.
هيٺ ڏنل ڪوڊ ڏيکاري ٿو ڪجھ طريقا HashSet:
import java.util.*;

class Test
{
    public static void main(String[]args)
    {
        HashSet<String> h = new HashSet<String>();

        // Add elements to the HashSet using the add() method
        h.add("India");
        h.add("Australia");
        h.add("South Africa");
        h.add("India");// try to add another same element

        // Print the elements of the HashSet to the console
        System.out.println(h);
        System.out.println("List contains India or not:" +
                           h.contains("India"));

        // Remove elements from the set using the remove() method
        h.remove("Australia");
        System.out.println("List after removing Australia:"+h);

        // Loop through the elements of the HashSet using an iterator:
        System.out.println("Iterating over list:");
        Iterator<String> i = h.iterator();
        while (i.hasNext())
            System.out.println(i.next());
    }
}
نتيجو:
[South Africa, Australia, India]
List contains India or not:true
List after removing Australia:[South Africa, India]
Iterating over list:
South Africa
India
سڀئي طبقا جيڪي هڪ انٽرفيس کي لاڳو ڪن ٿا، Setاندروني طور تي عملدرآمد جي حمايت ڪن ٿيون Map. HashSetاسٽوريج عناصر استعمال ڪندي HashMap. جيتوڻيڪ HashMapهڪ عنصر کي شامل ڪرڻ لاءِ هڪ اهم-قدر جوڙو جي طور تي نمائندگي ڪرڻ گهرجي، HashSetصرف قيمت شامل ڪئي وئي آهي. حقيقت ۾، اسان جنهن قدر ڏانهن وڃون ٿا HashSetاهو اعتراض جي ڪنجي آهي HashMap، ۽ هڪ مستقل طور استعمال ڪيو ويندو آهي قدر HashMap. اهڙيءَ طرح، هر اهم-قدر واري جوڙي ۾، سڀني ڪنجين جو ساڳيو قدر هوندو. ۾ عمل درآمد :HashSetjava doc
private transient HashMap map;

// Constructor - 1
// All constructors implicitly create a HashMap object.
public HashSet()
{
    // Create an implicit HashMap object
    map = new HashMap();
}

// Constructor- 2
public HashSet(int initialCapacity)
{
    // Create an implicit HashMap object
    map = new HashMap(initialCapacity);
}

// An object of the Object class, each time acting as a value in the HashMap
private static final Object PRESENT = new Object();
جيڪڏهن توهان طريقي سان ڏسو ته add()y HashSet:
public boolean add(E e)
{
   return map.put(e, PRESENT) == null;
}
توھان نوٽ ڪري سگھو ٿا ته طريقو add()y HashSetسڏجي ٿو طريقي کي put()اندروني اعتراض تي HashMap، ان کي پاس ڪري عنصر کي شامل ڪيو وڃي چاٻي جي طور تي، ۽ PRESENT مسلسل قدر جي طور تي. طريقو ساڳيو ڪم ڪري ٿو remove(). اهو remove()اندروني اعتراض جو طريقو سڏيندو آهي HashMap:
public boolean remove(Object o)
{
  return map.remove(o) == PRESENT;
}
HashSetهيش ٽيبل تي ٻڌل آهي، ۽ شامل ڪرڻ، ختم ڪرڻ، يا ڏسڻ جا عمل، سراسري طور تي، مستقل (O(1)) وقت ۾ مڪمل ٿيندا . طريقا HashSet:
  1. boolean add(E e): ۾ هڪ عنصر شامل ڪري ٿو HashSet، جيڪڏهن ڪو به ناهي، پر جيڪڏهن اهڙو عنصر اڳ ۾ ئي موجود آهي، طريقو واپس اچي ٿو غلط .
  2. void clear():سڀني عناصر کي سيٽ مان ڪڍي ٿو.
  3. boolean contains(Object o): واپسي صحيح آھي جيڪڏھن ڏنل عنصر سيٽ ۾ موجود آھي.
  4. boolean remove(Object o): ڏنل عنصر کي سيٽ مان هٽائي ٿو، جيڪڏهن موجود هجي.
  5. Iterator iterator(): سيٽ جي عناصرن لاء هڪ آئٽرٽر ڏي ٿو.
  6. boolean isEmpty(): واپسي صحيح آهي جيڪڏهن سيٽ ۾ ڪو به عنصر نه آهي.
  7. Object clone(): مٿاڇري ڪلوننگ انجام ڏئي ٿو HashSet.
Javadoc: https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION