JavaRush /جاوا بلاگ /Random-UR /مختصراً مرکزی چیز کے بارے میں - جاوا کلیکشن فریم ورک
Viacheslav
سطح

مختصراً مرکزی چیز کے بارے میں - جاوا کلیکشن فریم ورک

گروپ میں شائع ہوا۔

راستے کا آغاز

آج میں اس طرح کے ایک دلچسپ موضوع کے بارے میں بات کرنا چاہوں گا جیسے " جاوا کلیکشن فریم ورک " یا آسان الفاظ میں، مجموعوں کے بارے میں۔ کوڈ کا زیادہ تر کام کسی نہ کسی شکل میں ڈیٹا پر کارروائی کرنا ہے۔ صارفین کی فہرست حاصل کریں، پتوں کی فہرست حاصل کریں، وغیرہ۔ کسی نہ کسی طرح ان کو ترتیب دیں، تلاش کریں، ان کا موازنہ کریں۔ یہی وجہ ہے کہ مجموعوں کے علم کو بنیادی مہارت سمجھا جاتا ہے۔ اس لیے میں اس کے بارے میں بات کرنا چاہتا ہوں۔ اس کے علاوہ، جاوا ڈویلپر انٹرویوز میں سب سے عام سوالات میں سے ایک مجموعہ ہے۔ مثال کے طور پر، "مجموعوں کا درجہ بندی بنائیں۔" آن لائن کمپائلر ہمارے راستے میں ہماری مدد کرے گا۔ مثال کے طور پر، آپ " Tutorialspoint Online Java Compiler " یا Repl.it استعمال کر سکتے ہیں۔ کسی بھی ڈیٹا ڈھانچے کو جاننے کا راستہ عام متغیرات (Variables) سے شروع ہوتا ہے۔ اوریکل ویب سائٹ پر، مختلف عنوانات کو "راستوں" یا ٹریلز کے طور پر پیش کیا جاتا ہے۔ لہذا، جاوا کو جاننے کے راستے کو " Trail: Learning the Java Language: Table of Contents " کہا جاتا ہے۔ اور زبان کی بنیادی باتیں (یعنی زبان کی بنیادی باتیں) متغیرات سے شروع ہوتی ہیں۔ لہذا، آئیے ایک سادہ کوڈ لکھیں:
public static void main(String[] args) {
	String user = "Max";
	System.out.println("Hello, " + user);
}
یہ ہر چیز میں اچھا ہے، سوائے اس کے کہ ہم یہ سمجھیں کہ یہ کوڈ صرف ایک متغیر کے لیے اچھا اور خوبصورت ہے۔ اگر ان میں سے کئی ہیں تو کیا کریں؟ ایک قسم کے ڈیٹا کو ذخیرہ کرنے کے لیے ارے ایجاد کیے گئے تھے۔ اوریکل سے اسی ٹریل میں ایک الگ سیکشن ہے جو صفوں کے لیے وقف ہے۔ اس حصے کو کہا جاتا ہے: " Arays "۔ صفوں کے ساتھ کام کرنا بھی بہت آسان ہے:
import java.util.Arrays;
class Main {
  public static void main(String[] args) {
    String[] users = new String[2];
    users[0] = "Max";
    users[1] = "John";
    System.out.println("Hello, " + Arrays.toString(users));
  }
}
Arrays ایک جگہ پر متعدد اقدار کو ذخیرہ کرنے کا مسئلہ حل کرتی ہے۔ لیکن یہ ایک حد نافذ کرتا ہے: سرنی کا سائز مستقل ہے۔ اگر، جیسا کہ مثال میں، ہم نے کہا کہ سائز = 2، تو یہ دو کے برابر ہے۔ بس۔ اگر ہم ایک بڑی صف چاہتے ہیں، تو ہمیں ایک نئی مثال بنانے کی ضرورت ہے۔ اس کے علاوہ، ایک عنصر کو تلاش کرنا بھی ایک صف کے لئے ایک مشکل چیز ہے. ایک طریقہ ہے Arrays.binarySearch، لیکن یہ تلاش صرف ایک ترتیب شدہ صف پر کام کرتی ہے (غیر ترتیب شدہ صف کے لیے، نتیجہ غیر متعینہ یا محض غیر متوقع ہے)۔ یعنی تلاش ہمیں ہر بار ترتیب دینے پر مجبور کرے گی۔ حذف کرنا بھی قدر کو صاف کرتا ہے۔ لہذا، ہم ابھی تک یہ نہیں جانتے کہ صف میں اصل میں کتنا ڈیٹا ہے، ہم صرف یہ جانتے ہیں کہ صف میں کتنے سیل ہیں۔ صفوں کے بارے میں اپنے علم کو تازہ کرنے کے لیے: اور جاوا زبان کی ترقی کے نتیجے میں، جاوا کلیکشن فریم ورک JDK 1.2 میں نمودار ہوا، جس کے بارے میں ہم آج بات کریں گے۔
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 2

مجموعہ

شروع سے ہی لاگت شروع کریں۔ مجموعے کیوں؟ یہ اصطلاح خود "Type Theory" اور "Abstract Data Types" جیسی چیزوں سے آتی ہے۔ لیکن اگر آپ کسی اعلیٰ معاملات کو نہیں دیکھتے، تو جب ہمارے پاس کئی چیزیں ہوں تو ہم انہیں "چیزوں کا مجموعہ" کہہ سکتے ہیں۔ جو اشیاء جمع کرتے ہیں۔ عام طور پر، لفظ جمع خود لات سے آتا ہے۔ مجموعہ "جمع کرنا، جمع کرنا۔" یعنی مجموعہ کسی چیز کا مجموعہ ہے، کچھ عناصر کے لیے ایک کنٹینر۔ تو ہمارے پاس عناصر کا مجموعہ ہے۔ ہم اس کے ساتھ کیا کرنا چاہتے ہیں:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 3
جیسا کہ آپ دیکھ سکتے ہیں، ہم کافی منطقی چیزیں چاہتے ہیں۔ ہم یہ بھی سمجھتے ہیں کہ ہم متعدد مجموعوں کے ساتھ کچھ کرنا چاہتے ہیں:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 4
اس کے مطابق، جاوا ڈویلپرز نے java.util.Collection انٹرفیس لکھا تاکہ تمام مجموعوں کے لیے اس عمومی رویے کو بیان کیا جا سکے ۔ کلیکشن انٹرفیس وہ جگہ ہے جہاں سے تمام مجموعے شروع ہوتے ہیں۔ مجموعہ ایک خیال ہے، یہ ایک خیال ہے کہ تمام مجموعوں کو کیسا برتاؤ کرنا چاہیے۔ لہذا، اصطلاح "مجموعہ" ایک انٹرفیس کے طور پر ظاہر کیا جاتا ہے. قدرتی طور پر، ایک انٹرفیس کے نفاذ کی ضرورت ہے. انٹرفیس java.util.Collectionمیں ایک تجریدی کلاس ہے AbstractCollection، یعنی کچھ "خلاصہ مجموعہ"، جو دوسرے نفاذ کے لیے کنکال کی نمائندگی کرتا ہے (جیسا کہ کلاس کے اوپر JavaDoc میں لکھا گیا ہے java.util.AbstractCollection)۔ مجموعوں کے بارے میں بات کرتے ہوئے، آئیے واپس جائیں اور یاد رکھیں کہ ہم ان پر اعادہ کرنا چاہتے ہیں۔ اس کا مطلب یہ ہے کہ ہم عناصر کے ذریعے ایک ایک کرکے اعادہ کرنا چاہتے ہیں۔ یہ ایک بہت اہم تصور ہے۔ لہذا، انٹرفیس کو Collectionوراثت میں ملا ہے Iterable۔ یہ بہت اہم ہے کیونکہ... سب سے پہلے، Iterable ہر چیز کو اس کے مندرجات کی بنیاد پر Iterator کو واپس کرنے کے قابل ہونا چاہیے۔ اور دوسری بات، ہر وہ چیز جو Iterable کو لوپس میں استعمال کیا جا سکتا ہے for-each-loop۔ اور یہ ایک تکرار کرنے والے کی مدد سے ہے کہ , , جیسے AbstractCollectionطریقے نافذ کیے جاتے ہیں ۔ اور جمع کرنے کو سمجھنے کا راستہ سب سے عام ڈیٹا ڈھانچے میں سے ایک سے شروع ہوتا ہے - ایک فہرست، یعنی . containstoArrayremoveList
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 5

فہرستیں

لہذا، فہرستیں مجموعوں کے درجہ بندی میں ایک اہم مقام رکھتی ہیں:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 6
جیسا کہ ہم دیکھ سکتے ہیں، فہرستیں java.util.List انٹرفیس کو نافذ کرتی ہیں ۔ فہرستیں بتاتی ہیں کہ ہمارے پاس عناصر کا ایک مجموعہ ہے جو یکے بعد دیگرے کسی نہ کسی ترتیب میں ترتیب دیا جاتا ہے۔ ہر عنصر کا ایک انڈیکس ہوتا ہے (جیسے ایک صف میں)۔ عام طور پر، ایک فہرست آپ کو ایک ہی قدر کے ساتھ عناصر رکھنے کی اجازت دیتی ہے۔ جیسا کہ ہم نے اوپر کہا، Listیہ عنصر کے اشاریہ کے بارے میں جانتا ہے۔ یہ آپ کو انڈیکس کے ذریعہ ایک عنصر ( ) حاصل کرنے getیا مخصوص انڈیکس ( set) کے لئے ایک قدر مقرر کرنے کی اجازت دیتا ہے۔ جمع کرنے کے طریقے add، آپ کو انڈیکس کی وضاحت کرنے کی اجازت دیتا ہے جہاں سے ان پر عمل کرنا ہے addAll۔ removeمزید برآں، y Listکے پاس ایک تکرار کرنے والے کا اپنا ورژن ہے ListIterator۔ یہ تکرار کنندہ عنصر کے اشاریہ کے بارے میں جانتا ہے، لہذا یہ نہ صرف آگے بلکہ پیچھے کی طرف بھی اعادہ کر سکتا ہے۔ یہ مجموعہ میں ایک مخصوص جگہ سے بھی بنایا جا سکتا ہے۔ تمام نفاذات میں، دو سب سے زیادہ استعمال ہوتے ہیں: ArrayListاور LinkedList. سب سے پہلے، ArrayListیہ ایک فہرست ہے ( ) ایک صف ( ) Listپر مبنی ہے ۔ یہ آپ کو عناصر تکArray "رینڈم رسائی" حاصل کرنے کی اجازت دیتا ہے ۔ بے ترتیب رسائی ایک عنصر کو انڈیکس کے ذریعہ فوری طور پر بازیافت کرنے کی صلاحیت ہے، بجائے اس کے کہ تمام عناصر کے ذریعے اعادہ کریں جب تک کہ ہمیں مطلوبہ انڈیکس والا عنصر نہ مل جائے۔ یہ ایک بنیاد کے طور پر صف ہے جو اسے حاصل کرنے کی اجازت دیتی ہے۔ اس کے برعکس، یہ ایک لنکڈ لسٹ ہے۔ منسلک فہرست میں ہر اندراج کو فارم میں دکھایا جاتا ہے ، جو ڈیٹا کو خود ذخیرہ کرتا ہے، ساتھ ہی اگلے (اگلے) اور پچھلے (پچھلے) کا لنک بھی ۔ اس طرح " ترتیب وار رسائی " کو نافذ کرتا ہے ۔ یہ واضح ہے کہ 5ویں عنصر کو تلاش کرنے کے لیے ہمیں پہلے عنصر سے آخری تک جانا پڑے گا، کیونکہ ہمیں پانچویں عنصر تک براہ راست رسائی نہیں ہے۔ ہم اسے صرف 4th عنصر سے حاصل کر سکتے ہیں۔ ان کے تصور میں فرق ذیل میں دیا گیا ہے: LinkedListEntryEntryLinkedList
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 7
کام میں، جیسا کہ آپ سمجھتے ہیں، ایک فرق بھی ہے۔ مثال کے طور پر، عناصر کو شامل کرنا۔ عناصر LinkedListصرف زنجیر میں لنکس کی طرح جڑے ہوئے ہیں۔ لیکن ArrayListیہ عناصر کو ایک صف میں محفوظ کرتا ہے۔ اور ایک صف، جیسا کہ ہم جانتے ہیں، اس کا سائز تبدیل نہیں کر سکتا۔ پھر یہ کیسے کام کرتا ہے ArrayList؟ اور یہ بہت آسان کام کرتا ہے۔ جب صف میں جگہ ختم ہوجاتی ہے، تو یہ 1.5 گنا بڑھ جاتی ہے۔ زوم کوڈ یہ ہے: int newCapacity = oldCapacity + (oldCapacity >> 1); آپریشن میں ایک اور فرق عناصر کا کوئی بھی آفسیٹ ہے۔ مثال کے طور پر، درمیان میں عناصر کو شامل کرتے یا ہٹاتے وقت۔ LinkedListکسی عنصر سے ہٹانے کے لیے ، صرف اس عنصر کے حوالہ جات کو ہٹا دیں۔ کی صورت میں، ArrayListہم ہر بار استعمال کرتے ہوئے عناصر کو تبدیل کرنے پر مجبور ہوتے ہیں System.arraycopy۔ اس طرح، جتنے زیادہ عناصر ہوں گے، اتنے ہی زیادہ اعمال انجام دینے ہوں گے۔ مزید تفصیلی وضاحت ان مضامین میں مل سکتی ہے: ArrayList کی جانچ کرنے کے بعد، کوئی مدد نہیں کر سکتا لیکن اس کے "پیروکار"، java.util.Vector کلاس کو یاد نہیں کر سکتا ۔ Vectorیہ اس میں مختلف ہے ArrayListکہ مجموعہ کے ساتھ کام کرنے کے طریقے (شامل کرنا، حذف کرنا وغیرہ) مطابقت پذیر ہیں۔ یعنی، اگر ایک تھریڈ ( Thread) عناصر کو شامل کرتا ہے، تو دوسرے تھریڈ اس وقت تک انتظار کریں گے جب تک کہ پہلا تھریڈ اپنا کام مکمل نہیں کر لیتا۔ چونکہ دھاگے کی حفاظت کی اکثر ضرورت نہیں ہوتی ہے، اس لیے ایسے معاملات میں کلاس کو استعمال کرنے کی سفارش کی جاتی ہے ArrayList، جیسا کہ کلاس کے لیے JavaDoc میں واضح طور پر بتایا گیا ہے Vector۔ اس کے علاوہ، Vectorیہ اپنے سائز کو 1.5 گنا نہیں ArrayListبلکہ 2 گنا بڑھاتا ہے۔ بصورت دیگر، رویہ ایک جیسا ہے - Vectorایک صف کی شکل میں عناصر کا ذخیرہ پوشیدہ ہے اور عناصر کو شامل کرنے/ہٹانے کے وہی نتائج ہوتے ہیں جیسے میں ArrayList۔ درحقیقت، Vectorہمیں یہ ایک وجہ سے یاد تھا۔ اگر ہم Javadoc میں دیکھیں تو ہم "Direct Known Subclasses" میں ایک ڈھانچہ دیکھیں گے جیسے java.util.Stack ۔ اسٹیک ایک دلچسپ ڈھانچہ ہے جو ایک LIFO last-in-first-out(آخری اندر، پہلے باہر) ڈھانچہ ہے۔ انگریزی سے ترجمہ شدہ اسٹیک ایک اسٹیک ہے (مثال کے طور پر کتابوں کے ڈھیر کی طرح)۔ اسٹیک اضافی طریقوں کو لاگو کرتا ہے: peek(دیکھو، دیکھو)، pop(دھکا)، push(پش)۔ طریقہ peekکا ترجمہ بطور نظر کیا جاتا ہے (مثال کے طور پر، بیگ کے اندر جھانکنے کا ترجمہ " بیگ کے اندر جھانکنا " کے طور پر کیا جاتا ہے، اور کی ہول کے ذریعے جھانکنے کا ترجمہ " کی ہول کے ذریعے جھانکنا " کے طور پر کیا جاتا ہے)۔ یہ طریقہ آپ کو اسٹیک کے "اوپر" کو دیکھنے کی اجازت دیتا ہے، یعنی آخری عنصر کو اسٹیک سے ہٹائے بغیر (یعنی ہٹائے بغیر) حاصل کریں۔ طریقہ pushایک نئے عنصر کو اسٹیک پر دھکیلتا ہے (جوڑتا ہے) اور اسے واپس کرتا ہے، اور عنصر کا طریقہ popہٹاتا ہے (ہٹاتا ہے) اور واپس کرتا ہے۔ تینوں صورتوں میں (یعنی جھانکنا، پاپ اور پش)، ہم صرف آخری عنصر (یعنی "اسٹیک کے اوپر") کے ساتھ کام کرتے ہیں۔ یہ اسٹیک ڈھانچے کی اہم خصوصیت ہے۔ ویسے، اسٹیکس کو سمجھنے کے لیے ایک دلچسپ کام ہے، جس کی تفصیل کتاب "A Programmer's Career" (کریکنگ کوڈنگ انٹرویو) میں بیان کی گئی ہے۔ ایک دلچسپ کام ہے جہاں "اسٹیک" ڈھانچہ (LIFO) کا استعمال کرتے ہوئے آپ کو "قطار" کو نافذ کرنے کی ضرورت ہے۔ ڈھانچہ (FIFO) یہ اس طرح نظر آنا چاہئے:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 8
اس کام کا تجزیہ یہاں پایا جا سکتا ہے: " Stacks کا استعمال کرتے ہوئے ایک قطار کو لاگو کریں - The Queue ADT ("LetCode پر Stacks کا استعمال کرتے ہوئے قطار لاگو کریں) "۔ لہذا ہم آسانی سے ایک نئے ڈیٹا ڈھانچے کی طرف بڑھتے ہیں - ایک قطار۔
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 9

قطار

قطار ایک ڈھانچہ ہے جو ہمیں زندگی سے واقف ہے۔ دکانوں پر، ڈاکٹروں کی قطار۔ جو بھی پہلے آیا (پہلے اندر) وہ سب سے پہلے قطار سے نکلے گا (فرسٹ آؤٹ)۔ جاوا میں، ایک قطار کی نمائندگی java.util.Queue انٹرفیس کرتی ہے ۔ قطار کے Javadoc کے مطابق، قطار میں درج ذیل طریقے شامل کیے گئے ہیں:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 10
جیسا کہ آپ دیکھ سکتے ہیں، آرڈر کے طریقے موجود ہیں (ان پر عمل درآمد میں ناکامی ایک استثناء سے بھری ہوئی ہے) اور درخواست کے طریقے ہیں (ان پر عمل درآمد کرنے میں ناکامی غلطیوں کا باعث نہیں بنتی ہے)۔ عنصر کو ہٹائے بغیر حاصل کرنا بھی ممکن ہے (جھانکنا یا عنصر)۔ قطار انٹرفیس میں ایک مفید جانشین بھی ہے - Deque ۔ یہ نام نہاد "دو طرفہ قطار" ہے۔ یعنی، ایسی قطار آپ کو اس ڈھانچے کو شروع اور آخر سے استعمال کرنے کی اجازت دیتی ہے۔ دستاویزات میں کہا گیا ہے کہ "ڈیکس کو LIFO (Last-In-First-Out) اسٹیک کے طور پر بھی استعمال کیا جا سکتا ہے۔ اس انٹرفیس کو لیگیسی اسٹیک کلاس کی ترجیح میں استعمال کیا جانا چاہیے۔"، یعنی اس کی بجائے Deque نفاذ کو استعمال کرنے کی سفارش کی جاتی ہے۔ اسٹیک. Javadoc دکھاتا ہے کہ Deque انٹرفیس کن طریقوں کی وضاحت کرتا ہے:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 11
آئیے دیکھتے ہیں کہ وہاں کیا عمل درآمد ہوتا ہے۔ اور ہم ایک دلچسپ حقیقت دیکھیں گے - LinkedList قطار کیمپ میں داخل ہو گیا ہے) یعنی LinkedList دونوں کو لاگو کرتا ہے List، اور Deque. لیکن یہاں "صرف قطاریں" بھی ہیں، مثال کے طور پر PriorityQueue۔ وہ اکثر یاد نہیں کیا جاتا، لیکن بیکار میں. سب سے پہلے، آپ اس قطار میں "غیر موازنہ آبجیکٹ" استعمال نہیں کر سکتے، یعنی یا تو Comparator کی وضاحت ہونی چاہیے یا تمام اشیاء کا موازنہ ہونا چاہیے۔ دوم، "یہ نفاذ O(log(n)) enqueuing اور dequeuing طریقوں کے لیے وقت فراہم کرتا ہے"۔ لوگاریتھمک پیچیدگی ایک وجہ سے ہے۔ ہیپ کی بنیاد پر ترجیحی قطار کو نافذ کیا گیا۔ Javadoc کا کہنا ہے: "ترجیحی قطار ایک متوازن بائنری ہیپ کے طور پر پیش کی جاتی ہے"۔ اس کے لیے اسٹوریج خود ایک باقاعدہ صف ہے۔ جو ضرورت پڑنے پر بڑھتا ہے۔ جب ڈھیر چھوٹا ہوتا ہے تو یہ 2 گنا بڑھ جاتا ہے۔ اور پھر 50 فیصد تک۔ کوڈ سے تبصرہ: "دوگنا سائز اگر چھوٹا ہو؛ بصورت دیگر %50 بڑھیں"۔ ترجیحی قطار اور بائنری ہیپ ایک الگ موضوع ہیں۔ تو مزید معلومات کے لیے: ایک نفاذ java.util.ArrayDequejava.util.Deque کلاس ہو سکتا ہے ۔ یعنی، فہرستوں کو ایک لنک شدہ فہرست اور ایک صف کا استعمال کرتے ہوئے لاگو کیا جا سکتا ہے، اور قطاروں کو بھی ایک صف کا استعمال کرتے ہوئے یا منسلک فہرست کا استعمال کرتے ہوئے لاگو کیا جا سکتا ہے۔ اور انٹرفیس میں "بلاکنگ قطار" کی نمائندگی کرنے والی اولاد ہے: اور ۔ باقاعدہ قطاروں کے مقابلے میں انٹرفیس کی تبدیلی یہ ہے: QueueDequeBlockingQueueBlockingDeque
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 12
آئیے قطاروں کو روکنے کی کچھ مثالیں دیکھتے ہیں۔ لیکن وہ دلچسپ ہیں۔ مثال کے طور پر، BlockingQueue کو لاگو کیا جاتا ہے: PriorityBlockingQueue ، SynchronousQueue ، ArrayBlockingQueue، DelayQueue ، LinkedBlockingQueue ۔ لیکن BlockingDequeوہ معیاری کلیکشن فریم ورک سے ہر چیز کو نافذ کرتے ہیں LinkedBlockingDeque۔ ہر قطار ایک الگ جائزے کا موضوع ہے۔ اور اس جائزے کے فریم ورک کے اندر، ہم طبقاتی درجہ بندی کو نہ صرف کے ساتھ List، بلکہ اس کے ساتھ بھی پیش کریں گے Queue:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 13
جیسا کہ ہم ڈایاگرام سے دیکھ سکتے ہیں، جاوا کلیکشن فریم ورک کے انٹرفیس اور کلاسز بہت زیادہ جڑے ہوئے ہیں۔ آئیے درجہ بندی کی ایک اور شاخ شامل کریں - Set۔
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 14

سیٹ

Set- "سیٹ" کے طور پر ترجمہ کیا گیا ہے۔ یہ ایک قطار اور فہرست سے مختلف ہے Setجو عناصر کے ذخیرے پر زیادہ تجرید میں ہے۔ Set- اشیاء کے تھیلے کی طرح، جہاں یہ معلوم نہ ہو کہ اشیاء کیسے واقع ہیں اور کس ترتیب میں پڑی ہیں۔ جاوا میں، ایسے سیٹ کی نمائندگی java.util.Set انٹرفیس کرتی ہے ۔ جیسا کہ دستاویزات میں کہا گیا ہے، Setیہ ایک "مجموعہ ہے جس میں کوئی ڈپلیکیٹ عناصر نہیں ہیں"۔ دلچسپ بات یہ ہے کہ انٹرفیس بذات خود Setانٹرفیس میں نئے طریقے شامل نہیں کرتا ہے Collection، بلکہ صرف ضروریات کو واضح کرتا ہے (جس میں ڈپلیکیٹس نہیں ہونے چاہئیں)۔ اس کے علاوہ، پچھلی تفصیل سے یہ معلوم ہوتا ہے کہ آپ Setاس سے صرف ایک عنصر حاصل نہیں کر سکتے۔ Iterator کو عناصر حاصل کرنے کے لیے استعمال کیا جاتا ہے۔ Setاس کے ساتھ کئی اور انٹرفیس وابستہ ہیں۔ پہلا یہ ہے SortedSet۔ جیسا کہ نام سے پتہ چلتا ہے، SortedSetیہ اشارہ کرتا ہے کہ اس طرح کے سیٹ کو ترتیب دیا گیا ہے، اور اس وجہ سے عناصر انٹرفیس کو لاگو کرتے ہیں Comparableیا مخصوص ہیں Comparator۔ اس کے علاوہ، SortedSetیہ کئی دلچسپ طریقے پیش کرتا ہے:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 15
اس کے علاوہ، طریقے ہیں first(قدر کے لحاظ سے سب سے چھوٹا عنصر) اور last(قدر کے لحاظ سے سب سے بڑا عنصر)۔ SortedSetایک وارث ہے - NavigableSet. اس انٹرفیس کا مقصد نیویگیشن کے طریقوں کو بیان کرنا ہے جو مناسب عناصر کو زیادہ درست طریقے سے شناخت کرنے کے لیے درکار ہیں۔ ایک دلچسپ بات یہ ہے NavigableSetکہ یہ معمول کے تکرار کرنے والے (جو سب سے چھوٹے سے بڑے تک جاتا ہے) کو ریورس آرڈر کے لئے ایک تکرار کرنے والا شامل کرتا ہے - descendingIterator۔ اس کے علاوہ، NavigableSetیہ آپ کو اپنے بارے میں ایک نظریہ حاصل کرنے کے لیے طریقہ استعمال کرنے کی اجازت دیتا ہے descendingSet(دیکھیں)، جس میں عناصر الٹ ترتیب میں ہیں۔ اسے اس لیے کہا جاتا ہے Viewکیونکہ نتیجے میں آنے والے عنصر کے ذریعے آپ اصل کے عناصر کو تبدیل کر سکتے ہیں Set۔ یعنی، جوہر میں، یہ اصل ڈیٹا کی ایک مختلف انداز میں نمائندگی ہے، نہ کہ اس کی نقل۔ دلچسپ بات یہ ہے NavigableSetکہ، جیسے ، (کم سے کم) اور (زیادہ سے زیادہ) عناصر کو Queueسنبھال سکتا ہے ۔ یعنی یہ عنصر حاصل کرتا ہے اور اسے سیٹ سے ہٹا دیتا ہے۔ وہاں کس قسم کے نفاذ ہیں؟ سب سے پہلے، سب سے مشہور نفاذ ہیش کوڈ پر مبنی ہے - HashSet ۔ ایک اور یکساں طور پر معروف نفاذ ایک سرخ سیاہ درخت پر مبنی ہے - TreeSet ۔ آئیے اپنا خاکہ مکمل کریں: pollFirstpollLast
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 16
مجموعوں کے اندر، یہ درجہ بندی کو چھانٹنا باقی ہے - ہرمیٹس۔ جو پہلی نظر میں ایک طرف کھڑا ہے - java.util.Map.
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 17

نقشے

Maps ایک ڈیٹا ڈھانچہ ہے جس میں ڈیٹا کو کلید کے ذریعے محفوظ کیا جاتا ہے۔ مثال کے طور پر، کلید ایک ID یا شہر کا کوڈ ہو سکتا ہے۔ اور اسی کلید کے ذریعے ڈیٹا کو تلاش کیا جائے گا۔ یہ دلچسپ ہے کہ کارڈ الگ سے دکھائے جاتے ہیں۔ ڈویلپرز کے مطابق (" جاوا کلیکشن API ڈیزائن FAQ " دیکھیں)، کلیدی قدر کی نقشہ سازی کوئی مجموعہ نہیں ہے۔ اور نقشوں کو زیادہ تیزی سے چابیاں کا مجموعہ، اقدار کا مجموعہ، کلیدی قدر کے جوڑوں کا مجموعہ سمجھا جا سکتا ہے۔ یہ اتنا دلچسپ جانور ہے۔ کارڈز کیا طریقے فراہم کرتے ہیں؟ آئیے جاوا API انٹرفیس java.util.Map کو دیکھتے ہیں ۔ کیونکہ چونکہ نقشے مجموعے نہیں ہیں (وہ مجموعوں سے وراثت میں نہیں آتے ہیں) اس لیے ان میں ایک contains. اور یہ منطقی ہے۔ نقشہ کلیدوں اور اقدار پر مشتمل ہوتا ہے۔ ان میں سے کون سا طریقہ چیک کرنا چاہئے containsاور کس طرح الجھنا نہیں ہے؟ لہذا، انٹرفیس کے Mapدو مختلف ورژن ہیں: containsKey(ایک کلید پر مشتمل ہے) اور containsValue(ایک قدر پر مشتمل ہے)۔ اس کا استعمال keySetآپ کو چابیاں کا ایک سیٹ حاصل کرنے کی اجازت دیتا ہے (وہی ایک Set)۔ اور طریقہ استعمال کرتے ہوئے valuesہم نقشے میں اقدار کا مجموعہ حاصل کر سکتے ہیں۔ نقشے کی چابیاں منفرد ہیں، جن پر ڈیٹا ڈھانچہ زور دیتا ہے Set۔ قدروں کو دہرایا جا سکتا ہے، جس پر ڈیٹا جمع کرنے کے ڈھانچے کے ذریعے زور دیا جاتا ہے۔ اس کے علاوہ، طریقہ استعمال کرتے ہوئے entrySetہم کلیدی قدر کے جوڑوں کا ایک سیٹ حاصل کر سکتے ہیں۔ آپ سب سے تفصیلی تجزیوں میں اس بارے میں مزید پڑھ سکتے ہیں کہ کارڈ پر کون سے عمل درآمد ہوتے ہیں: میں یہ بھی دیکھنا چاہوں گا کہ کیا HashMapبہت مماثلت ہے HashSet, اور TreeMapسے TreeSet. یہاں تک کہ ان کے ایک جیسے انٹرفیس ہیں: NavigableSetاور NavigableMap، SortedSetاور SortedMap۔ تو ہمارا آخری نقشہ اس طرح نظر آئے گا:
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 18
ہم اس دلچسپ حقیقت کے ساتھ ختم کر سکتے ہیں کہ مجموعہ Setاندرونی طور پر استعمال کرتا ہے Map، جہاں اضافی قدریں کلیدیں ہیں، اور قدر ہر جگہ ایک جیسی ہے۔ یہ دلچسپ ہے کیونکہ یہ Mapمجموعہ اور واپسی نہیں ہے Set، جو کہ ایک مجموعہ ہے لیکن درحقیقت اسے بطور لاگو کیا گیا ہے Map۔ تھوڑا غیر حقیقی، لیکن یہ اس طرح نکلا)
مرکزی چیز کے بارے میں مختصراً - جاوا کلیکشن فریم ورک - 19

نتیجہ

اچھی خبر یہ ہے کہ اس سے یہ جائزہ ختم ہوتا ہے۔ بری خبر یہ ہے کہ یہ بہت جائزہ لینے والا مضمون ہے۔ مجموعوں میں سے ہر ایک کا نفاذ ایک الگ مضمون کا مستحق ہے، اور ہماری نظروں سے پوشیدہ ہر الگورتھم کے لیے بھی۔ لیکن اس جائزے کا مقصد یہ یاد رکھنا ہے کہ وہ کیا ہیں اور انٹرفیس کے درمیان کیا کنکشن ہیں۔ مجھے امید ہے کہ سوچ سمجھ کر پڑھنے کے بعد آپ میموری سے مجموعوں کا خاکہ تیار کر سکیں گے۔ ٹھیک ہے، ہمیشہ کی طرح، کچھ لنکس: #ویاچسلاو
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION