شما روی پروژهای کار میکنید که هدفش توسعهی یک سامانهی زمانبندی قطار برای شبکهی راهآهنی پرتردد است.
از شما خواسته شده است که یک نمونهی اولیه برای مسیرهای قطار در سامانهی زمانبندی توسعه دهید. هر مسیر از دنبالهای از ایستگاههای قطار تشکیل میشود که قطار موردنظر در آنها توقف میکند.
تیم شما تصمیم گرفته است برای نمایش هر مسیر قطار در برنامهی زمانی، از یک «لیست پیوندی دوطرفه» استفاده کند. هر ایستگاه در مسیر قطار با یک گره در لیست پیوندی نمایش داده میشود.
لازم نیست نگران زمان رسیدن و حرکت در ایستگاهها باشید. هر ایستگاه بهسادگی با یک عدد نمایش داده میشود.
میتوان مسیرها را گسترش داد و به ابتدا یا انتهای یک مسیر ایستگاه افزود. همچنین میتوان با حذف ایستگاهها از ابتدا یا انتهای یک مسیر، آن را کوتاه کرد.
گاهی یک ایستگاه تعطیل میشود و در آن صورت باید آن ایستگاه از مسیر حذف شود، حتی اگر در ابتدا یا انتهای مسیر نباشد.
اندازهی یک مسیر نه با مسافتی که قطار میپیماید اندازهگیری میشود، بلکه با تعداد ایستگاههایی که در آنها توقف میکند.
لیست پیوندی یک ساختار دادهی بنیادی در علوم کامپیوتر است که اغلب در پیادهسازی ساختارهای دادهی دیگر به کار میرود. همانطور که از اسمش پیداست، لیستی از گرههاست که به هم پیوند خوردهاند. لیستی از «گرهها» است که هر گره به همسایه یا همسایههایش پیوند میخورد. در یک لیست پیوندی یکطرفه هر گره فقط به گره بعدی خود پیوند میخورد. در یک لیست پیوندی دوطرفه هر گره هم به گره قبلی و هم به گره بعدی خود پیوند میخورد.
اگر میخواهید دربارهی لیستهای پیوندی بیشتر بدانید، نگاهی به این مقاله بیندازید که آن را با تصویرهای زیبا توضیح میدهد.
این تمرین مفهوم جنریک را معرفی میکند.
برای اینکه تستها پاس شوند، باید کلاس خود را طوری بسازید که هر نوع ورودی، مثلاً Integer یا String را بپذیرد.
جنریکها مفیدند، چون به شما امکان میدهند کدی کلیتر و قابل استفادهی مجدد بنویسید.
پیادهسازیهای List و Map در جاوا هر دو نمونههایی از کلاسهایی هستند که از جنریک استفاده میکنند.
با استفاده از آنها میتوانید یک List بسازید که Integers را در خود داشته باشد، یا لیستی بسازید که Strings یا هر نوع دیگری را در خود جای دهد.
برای نوعهایی که در جنریک به کار میروند، چند محدودیت وجود دارد.
یکی از آنها این است که وقتی یک List ساختهاید که Integers را در خود دارد، نمیتوانید Strings را در آن بگذارید.
باید هنگام ساخت کلاس مشخص کنید چه نوعی را میخواهید در آن قرار دهید. آن نمونه هم بعد از آن فقط با همان نوع قابل استفاده است.
برای مثال میتوانید لیستی از Integers بسازید:
List<Integer> someList = new LinkedList<>();
حالا someList فقط میتواند Integers را در خود داشته باشد. این کار را هم میتوانید بکنید:
List<String> someOtherList = new LinkedList<>()
حالا someOtherList فقط میتواند Strings را در خود داشته باشد.
محدودیت دیگر این است که هر نوعی که با جنریک استفاده میشود نمیتواند یک نوع اولیه باشد، مثل int یا long.
با این حال، هر نوع اولیه یک نوع ارجاعی متناظر دارد؛ پس بهجای int میتوانید از Integer و بهجای long میتوانید از Long استفاده کنید.
نگاه کردن به نمونهای از کاربرد جنریک میتواند برای شروع به شما کمک کند.