راستے کا آغاز
آج میں اس طرح کے ایک دلچسپ موضوع کے بارے میں بات کرنا چاہوں گا جیسے "
جاوا کلیکشن فریم ورک " یا آسان الفاظ میں، مجموعوں کے بارے میں۔ کوڈ کا زیادہ تر کام کسی نہ کسی شکل میں ڈیٹا پر کارروائی کرنا ہے۔ صارفین کی فہرست حاصل کریں، پتوں کی فہرست حاصل کریں، وغیرہ۔ کسی نہ کسی طرح ان کو ترتیب دیں، تلاش کریں، ان کا موازنہ کریں۔ یہی وجہ ہے کہ مجموعوں کے علم کو بنیادی مہارت سمجھا جاتا ہے۔ اس لیے میں اس کے بارے میں بات کرنا چاہتا ہوں۔ اس کے علاوہ، جاوا ڈویلپر انٹرویوز میں سب سے عام سوالات میں سے ایک مجموعہ ہے۔ مثال کے طور پر، "مجموعوں کا درجہ بندی بنائیں۔" آن لائن کمپائلر ہمارے راستے میں ہماری مدد کرے گا۔ مثال کے طور پر، آپ " 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 میں نمودار ہوا، جس کے بارے میں ہم آج بات کریں گے۔
مجموعہ
شروع سے ہی لاگت شروع کریں۔ مجموعے کیوں؟ یہ اصطلاح خود "Type Theory" اور "Abstract Data Types" جیسی چیزوں سے آتی ہے۔ لیکن اگر آپ کسی اعلیٰ معاملات کو نہیں دیکھتے، تو جب ہمارے پاس کئی چیزیں ہوں تو ہم انہیں "چیزوں کا مجموعہ" کہہ سکتے ہیں۔ جو اشیاء جمع کرتے ہیں۔ عام طور پر، لفظ جمع خود لات سے آتا ہے۔ مجموعہ "جمع کرنا، جمع کرنا۔" یعنی مجموعہ کسی چیز کا مجموعہ ہے، کچھ عناصر کے لیے ایک کنٹینر۔ تو ہمارے پاس عناصر کا مجموعہ ہے۔ ہم اس کے ساتھ کیا کرنا چاہتے ہیں:
جیسا کہ آپ دیکھ سکتے ہیں، ہم کافی منطقی چیزیں چاہتے ہیں۔ ہم یہ بھی سمجھتے ہیں کہ ہم متعدد مجموعوں کے ساتھ کچھ کرنا چاہتے ہیں:
اس کے مطابق، جاوا ڈویلپرز نے java.util.Collection انٹرفیس لکھا تاکہ تمام مجموعوں کے لیے اس عمومی رویے کو بیان کیا جا سکے ۔ کلیکشن انٹرفیس وہ جگہ ہے جہاں سے تمام مجموعے شروع ہوتے ہیں۔ مجموعہ ایک خیال ہے، یہ ایک خیال ہے کہ تمام مجموعوں کو کیسا برتاؤ کرنا چاہیے۔ لہذا، اصطلاح "مجموعہ" ایک انٹرفیس کے طور پر ظاہر کیا جاتا ہے. قدرتی طور پر، ایک انٹرفیس کے نفاذ کی ضرورت ہے. انٹرفیس
java.util.Collection
میں ایک تجریدی کلاس ہے
AbstractCollection
، یعنی کچھ "خلاصہ مجموعہ"، جو دوسرے نفاذ کے لیے کنکال کی نمائندگی کرتا ہے (جیسا کہ کلاس کے اوپر JavaDoc میں لکھا گیا ہے
java.util.AbstractCollection
)۔ مجموعوں کے بارے میں بات کرتے ہوئے، آئیے واپس جائیں اور یاد رکھیں کہ ہم ان پر اعادہ کرنا چاہتے ہیں۔ اس کا مطلب یہ ہے کہ ہم عناصر کے ذریعے ایک ایک کرکے اعادہ کرنا چاہتے ہیں۔ یہ ایک بہت اہم تصور ہے۔ لہذا، انٹرفیس کو
Collection
وراثت میں ملا ہے
Iterable
۔ یہ بہت اہم ہے کیونکہ... سب سے پہلے، Iterable ہر چیز کو اس کے مندرجات کی بنیاد پر Iterator کو واپس کرنے کے قابل ہونا چاہیے۔ اور دوسری بات، ہر وہ چیز جو Iterable کو لوپس میں استعمال کیا جا سکتا ہے
for-each-loop
۔ اور یہ ایک تکرار کرنے والے کی مدد سے ہے کہ , , جیسے
AbstractCollection
طریقے نافذ کیے جاتے ہیں ۔ اور جمع کرنے کو سمجھنے کا راستہ سب سے عام ڈیٹا ڈھانچے میں سے ایک سے شروع ہوتا ہے - ایک فہرست، یعنی .
contains
toArray
remove
List
فہرستیں
لہذا، فہرستیں مجموعوں کے درجہ بندی میں ایک اہم مقام رکھتی ہیں:
جیسا کہ ہم دیکھ سکتے ہیں، فہرستیں
java.util.List انٹرفیس کو نافذ کرتی ہیں ۔ فہرستیں بتاتی ہیں کہ ہمارے پاس عناصر کا ایک مجموعہ ہے جو یکے بعد دیگرے کسی نہ کسی ترتیب میں ترتیب دیا جاتا ہے۔ ہر عنصر کا ایک انڈیکس ہوتا ہے (جیسے ایک صف میں)۔ عام طور پر، ایک فہرست آپ کو ایک ہی قدر کے ساتھ عناصر رکھنے کی اجازت دیتی ہے۔ جیسا کہ ہم نے اوپر کہا،
List
یہ عنصر کے اشاریہ کے بارے میں جانتا ہے۔ یہ آپ کو انڈیکس کے ذریعہ ایک عنصر ( ) حاصل کرنے
get
یا مخصوص انڈیکس (
set
) کے لئے ایک قدر مقرر کرنے کی اجازت دیتا ہے۔ جمع کرنے کے طریقے
add
، آپ کو انڈیکس کی وضاحت کرنے کی اجازت دیتا ہے جہاں سے ان پر عمل کرنا ہے
addAll
۔
remove
مزید برآں، y
List
کے پاس ایک تکرار کرنے والے کا اپنا ورژن ہے
ListIterator
۔ یہ تکرار کنندہ عنصر کے اشاریہ کے بارے میں جانتا ہے، لہذا یہ نہ صرف آگے بلکہ پیچھے کی طرف بھی اعادہ کر سکتا ہے۔ یہ مجموعہ میں ایک مخصوص جگہ سے بھی بنایا جا سکتا ہے۔ تمام نفاذات میں، دو سب سے زیادہ استعمال ہوتے ہیں:
ArrayList
اور
LinkedList
. سب سے پہلے،
ArrayList
یہ ایک فہرست ہے ( ) ایک صف ( )
List
پر مبنی ہے ۔ یہ آپ کو عناصر
تکArray
"رینڈم رسائی" حاصل کرنے کی اجازت دیتا ہے ۔ بے ترتیب رسائی ایک عنصر کو انڈیکس کے ذریعہ فوری طور پر بازیافت کرنے کی صلاحیت ہے، بجائے اس کے کہ تمام عناصر کے ذریعے اعادہ کریں جب تک کہ ہمیں مطلوبہ انڈیکس والا عنصر نہ مل جائے۔ یہ ایک بنیاد کے طور پر صف ہے جو اسے حاصل کرنے کی اجازت دیتی ہے۔ اس کے برعکس، یہ ایک لنکڈ لسٹ ہے۔ منسلک فہرست میں ہر اندراج کو فارم میں دکھایا جاتا ہے ، جو ڈیٹا کو خود ذخیرہ کرتا ہے، ساتھ ہی اگلے (اگلے) اور پچھلے (پچھلے) کا لنک بھی ۔ اس طرح " ترتیب وار رسائی
" کو نافذ کرتا ہے ۔ یہ واضح ہے کہ 5ویں عنصر کو تلاش کرنے کے لیے ہمیں پہلے عنصر سے آخری تک جانا پڑے گا، کیونکہ ہمیں پانچویں عنصر تک براہ راست رسائی نہیں ہے۔ ہم اسے صرف 4th عنصر سے حاصل کر سکتے ہیں۔ ان کے تصور میں فرق ذیل میں دیا گیا ہے:
LinkedList
Entry
Entry
LinkedList
کام میں، جیسا کہ آپ سمجھتے ہیں، ایک فرق بھی ہے۔ مثال کے طور پر، عناصر کو شامل کرنا۔ عناصر
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) یہ اس طرح نظر آنا چاہئے:
اس کام کا تجزیہ یہاں پایا جا سکتا ہے: "
Stacks کا استعمال کرتے ہوئے ایک قطار کو لاگو کریں - The Queue ADT ("LetCode پر Stacks کا استعمال کرتے ہوئے قطار لاگو کریں) "۔ لہذا ہم آسانی سے ایک نئے ڈیٹا ڈھانچے کی طرف بڑھتے ہیں - ایک قطار۔
قطار
قطار ایک ڈھانچہ ہے جو ہمیں زندگی سے واقف ہے۔ دکانوں پر، ڈاکٹروں کی قطار۔ جو بھی پہلے آیا (پہلے اندر) وہ سب سے پہلے قطار سے نکلے گا (فرسٹ آؤٹ)۔ جاوا میں، ایک قطار کی نمائندگی
java.util.Queue انٹرفیس کرتی ہے ۔ قطار کے Javadoc کے مطابق، قطار میں درج ذیل طریقے شامل کیے گئے ہیں:
جیسا کہ آپ دیکھ سکتے ہیں، آرڈر کے طریقے موجود ہیں (ان پر عمل درآمد میں ناکامی ایک استثناء سے بھری ہوئی ہے) اور درخواست کے طریقے ہیں (ان پر عمل درآمد کرنے میں ناکامی غلطیوں کا باعث نہیں بنتی ہے)۔ عنصر کو ہٹائے بغیر حاصل کرنا بھی ممکن ہے (جھانکنا یا عنصر)۔ قطار انٹرفیس میں ایک مفید جانشین بھی ہے -
Deque ۔ یہ نام نہاد "دو طرفہ قطار" ہے۔ یعنی، ایسی قطار آپ کو اس ڈھانچے کو شروع اور آخر سے استعمال کرنے کی اجازت دیتی ہے۔ دستاویزات میں کہا گیا ہے کہ "ڈیکس کو LIFO (Last-In-First-Out) اسٹیک کے طور پر بھی استعمال کیا جا سکتا ہے۔ اس انٹرفیس کو لیگیسی اسٹیک کلاس کی ترجیح میں استعمال کیا جانا چاہیے۔"، یعنی اس کی بجائے Deque نفاذ کو استعمال کرنے کی سفارش کی جاتی ہے۔ اسٹیک. Javadoc دکھاتا ہے کہ Deque انٹرفیس کن طریقوں کی وضاحت کرتا ہے:
آئیے دیکھتے ہیں کہ وہاں کیا عمل درآمد ہوتا ہے۔ اور ہم ایک دلچسپ حقیقت دیکھیں گے - LinkedList قطار کیمپ میں داخل ہو گیا ہے) یعنی LinkedList دونوں کو لاگو کرتا ہے
List
، اور
Deque
. لیکن یہاں "صرف قطاریں" بھی ہیں، مثال کے طور پر
PriorityQueue
۔ وہ اکثر یاد نہیں کیا جاتا، لیکن بیکار میں. سب سے پہلے، آپ اس قطار میں "غیر موازنہ آبجیکٹ" استعمال نہیں کر سکتے، یعنی یا تو Comparator کی وضاحت ہونی چاہیے یا تمام اشیاء کا موازنہ ہونا چاہیے۔ دوم، "یہ نفاذ O(log(n)) enqueuing اور dequeuing طریقوں کے لیے وقت فراہم کرتا ہے"۔ لوگاریتھمک پیچیدگی ایک وجہ سے ہے۔ ہیپ کی بنیاد پر ترجیحی قطار کو نافذ کیا گیا۔ Javadoc کا کہنا ہے: "ترجیحی قطار ایک متوازن بائنری ہیپ کے طور پر پیش کی جاتی ہے"۔ اس کے لیے اسٹوریج خود ایک باقاعدہ صف ہے۔ جو ضرورت پڑنے پر بڑھتا ہے۔ جب ڈھیر چھوٹا ہوتا ہے تو یہ 2 گنا بڑھ جاتا ہے۔ اور پھر 50 فیصد تک۔ کوڈ سے تبصرہ: "دوگنا سائز اگر چھوٹا ہو؛ بصورت دیگر %50 بڑھیں"۔ ترجیحی قطار اور بائنری ہیپ ایک الگ موضوع ہیں۔ تو مزید معلومات کے لیے:
ایک نفاذ
java.util.ArrayDequejava.util.Deque
کلاس ہو سکتا ہے ۔ یعنی، فہرستوں کو ایک لنک شدہ فہرست اور ایک صف کا استعمال کرتے ہوئے لاگو کیا جا سکتا ہے، اور قطاروں کو بھی ایک صف کا استعمال کرتے ہوئے یا منسلک فہرست کا استعمال کرتے ہوئے لاگو کیا جا سکتا ہے۔ اور انٹرفیس میں "بلاکنگ قطار" کی نمائندگی کرنے والی اولاد ہے: اور ۔ باقاعدہ قطاروں کے مقابلے میں انٹرفیس کی تبدیلی یہ ہے:
Queue
Deque
BlockingQueue
BlockingDeque
آئیے قطاروں کو روکنے کی کچھ مثالیں دیکھتے ہیں۔ لیکن وہ دلچسپ ہیں۔ مثال کے طور پر، BlockingQueue کو لاگو کیا جاتا ہے:
PriorityBlockingQueue ،
SynchronousQueue ، ArrayBlockingQueue،
DelayQueue ،
LinkedBlockingQueue ۔ لیکن
BlockingDeque
وہ معیاری کلیکشن فریم ورک سے ہر چیز کو نافذ کرتے ہیں
LinkedBlockingDeque
۔ ہر قطار ایک الگ جائزے کا موضوع ہے۔ اور اس جائزے کے فریم ورک کے اندر، ہم طبقاتی درجہ بندی کو نہ صرف کے ساتھ
List
، بلکہ اس کے ساتھ بھی پیش کریں گے
Queue
:
جیسا کہ ہم ڈایاگرام سے دیکھ سکتے ہیں، جاوا کلیکشن فریم ورک کے انٹرفیس اور کلاسز بہت زیادہ جڑے ہوئے ہیں۔ آئیے درجہ بندی کی ایک اور شاخ شامل کریں -
Set
۔
سیٹ
Set
- "سیٹ" کے طور پر ترجمہ کیا گیا ہے۔ یہ ایک قطار اور فہرست سے مختلف ہے
Set
جو عناصر کے ذخیرے پر زیادہ تجرید میں ہے۔
Set
- اشیاء کے تھیلے کی طرح، جہاں یہ معلوم نہ ہو کہ اشیاء کیسے واقع ہیں اور کس ترتیب میں پڑی ہیں۔ جاوا میں، ایسے سیٹ کی نمائندگی
java.util.Set انٹرفیس کرتی ہے ۔ جیسا کہ دستاویزات میں کہا گیا ہے،
Set
یہ ایک "مجموعہ ہے جس میں کوئی ڈپلیکیٹ عناصر نہیں ہیں"۔ دلچسپ بات یہ ہے کہ انٹرفیس بذات خود
Set
انٹرفیس میں نئے طریقے شامل نہیں کرتا ہے
Collection
، بلکہ صرف ضروریات کو واضح کرتا ہے (جس میں ڈپلیکیٹس نہیں ہونے چاہئیں)۔ اس کے علاوہ، پچھلی تفصیل سے یہ معلوم ہوتا ہے کہ آپ
Set
اس سے صرف ایک عنصر حاصل نہیں کر سکتے۔ Iterator کو عناصر حاصل کرنے کے لیے استعمال کیا جاتا ہے۔
Set
اس کے ساتھ کئی اور انٹرفیس وابستہ ہیں۔ پہلا یہ ہے
SortedSet
۔ جیسا کہ نام سے پتہ چلتا ہے،
SortedSet
یہ اشارہ کرتا ہے کہ اس طرح کے سیٹ کو ترتیب دیا گیا ہے، اور اس وجہ سے عناصر انٹرفیس کو لاگو کرتے ہیں
Comparable
یا مخصوص ہیں
Comparator
۔ اس کے علاوہ،
SortedSet
یہ کئی دلچسپ طریقے پیش کرتا ہے:
اس کے علاوہ، طریقے ہیں
first
(قدر کے لحاظ سے سب سے چھوٹا عنصر) اور
last
(قدر کے لحاظ سے سب سے بڑا عنصر)۔
SortedSet
ایک وارث ہے -
NavigableSet
. اس انٹرفیس کا مقصد نیویگیشن کے طریقوں کو بیان کرنا ہے جو مناسب عناصر کو زیادہ درست طریقے سے شناخت کرنے کے لیے درکار ہیں۔ ایک دلچسپ بات یہ ہے
NavigableSet
کہ یہ معمول کے تکرار کرنے والے (جو سب سے چھوٹے سے بڑے تک جاتا ہے) کو ریورس آرڈر کے لئے ایک تکرار کرنے والا شامل کرتا ہے -
descendingIterator
۔ اس کے علاوہ،
NavigableSet
یہ آپ کو اپنے بارے میں ایک نظریہ حاصل کرنے کے لیے طریقہ استعمال کرنے کی اجازت دیتا ہے
descendingSet
(دیکھیں)، جس میں عناصر الٹ ترتیب میں ہیں۔ اسے اس لیے کہا جاتا ہے
View
کیونکہ نتیجے میں آنے والے عنصر کے ذریعے آپ اصل کے عناصر کو تبدیل کر سکتے ہیں
Set
۔ یعنی، جوہر میں، یہ اصل ڈیٹا کی ایک مختلف انداز میں نمائندگی ہے، نہ کہ اس کی نقل۔ دلچسپ بات یہ ہے
NavigableSet
کہ، جیسے ، (کم سے کم) اور (زیادہ سے زیادہ) عناصر کو
Queue
سنبھال سکتا ہے ۔ یعنی یہ عنصر حاصل کرتا ہے اور اسے سیٹ سے ہٹا دیتا ہے۔ وہاں کس قسم کے نفاذ ہیں؟ سب سے پہلے، سب سے مشہور نفاذ ہیش کوڈ پر مبنی ہے -
HashSet ۔ ایک اور یکساں طور پر معروف نفاذ ایک سرخ سیاہ درخت پر مبنی ہے -
TreeSet ۔ آئیے اپنا خاکہ مکمل کریں:
pollFirst
pollLast
مجموعوں کے اندر، یہ درجہ بندی کو چھانٹنا باقی ہے - ہرمیٹس۔ جو پہلی نظر میں ایک طرف کھڑا ہے -
java.util.Map
.
نقشے
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
۔ تو ہمارا آخری نقشہ اس طرح نظر آئے گا:
ہم اس دلچسپ حقیقت کے ساتھ ختم کر سکتے ہیں کہ مجموعہ
Set
اندرونی طور پر استعمال کرتا ہے
Map
، جہاں اضافی قدریں کلیدیں ہیں، اور قدر ہر جگہ ایک جیسی ہے۔ یہ دلچسپ ہے کیونکہ یہ
Map
مجموعہ اور واپسی نہیں ہے
Set
، جو کہ ایک مجموعہ ہے لیکن درحقیقت اسے بطور لاگو کیا گیا ہے
Map
۔ تھوڑا غیر حقیقی، لیکن یہ اس طرح نکلا)
نتیجہ
اچھی خبر یہ ہے کہ اس سے یہ جائزہ ختم ہوتا ہے۔ بری خبر یہ ہے کہ یہ بہت جائزہ لینے والا مضمون ہے۔ مجموعوں میں سے ہر ایک کا نفاذ ایک الگ مضمون کا مستحق ہے، اور ہماری نظروں سے پوشیدہ ہر الگورتھم کے لیے بھی۔ لیکن اس جائزے کا مقصد یہ یاد رکھنا ہے کہ وہ کیا ہیں اور انٹرفیس کے درمیان کیا کنکشن ہیں۔ مجھے امید ہے کہ سوچ سمجھ کر پڑھنے کے بعد آپ میموری سے مجموعوں کا خاکہ تیار کر سکیں گے۔
ٹھیک ہے، ہمیشہ کی طرح، کچھ لنکس:
#ویاچسلاو
GO TO FULL VERSION