مسیرها
/
Java
Java
/
تمرین‌ها
/
عملیات لیست
عملیات لیست

عملیات لیست

دشوار

دستورالعمل‌ها

عملیات پایه‌ای لیست را پیاده‌سازی کنید.

در زبان‌های تابعی، عملیات لیست مانند length، map و reduce بسیار رایج‌اند. مجموعه‌ای از عملیات پایه‌ای لیست را بدون استفاده از توابع موجود پیاده‌سازی کنید.

تعداد و نام دقیق عملیاتی که باید پیاده‌سازی شوند بسته به track است تا با نام‌های موجود تداخل نکنند، اما عملیات کلی که پیاده‌سازی می‌کنید عبارت‌اند از:

  • append (با گرفتن دو لیست، همه‌ی عناصر لیست دوم را به انتهای لیست اول اضافه می‌کند)؛
  • concatenate (با گرفتن چندین لیست، همه‌ی عناصر همه‌ی لیست‌ها را در یک لیست مسطح ترکیب می‌کند)؛
  • filter (با گرفتن یک «محمول» و یک لیست، لیست همه‌ی عناصری را برمی‌گرداند که predicate(item) برایشان «درست» است)؛
  • length (با گرفتن یک لیست، تعداد کل عناصر آن را برمی‌گرداند)؛
  • map (با گرفتن یک تابع و یک لیست، لیست نتایج اعمال function(item) روی همه‌ی عناصر را برمی‌گرداند)؛
  • foldl (با گرفتن یک تابع، یک لیست و «انباشتگر» اولیه، هر عنصر را از سمت چپ در انباشتگر تا می‌کند (کاهش می‌دهد))؛
  • foldr (با گرفتن یک تابع، یک لیست و «انباشتگر» اولیه، هر عنصر را از سمت راست در انباشتگر تا می‌کند (کاهش می‌دهد))؛
  • reverse (با گرفتن یک لیست، لیستی برمی‌گرداند که همه‌ی عناصر اصلی را دارد، اما با ترتیب معکوس).

توجه کنید که ترتیبی که آرگومان‌ها به توابع تا (foldl، foldr) داده می‌شوند اهمیت دارد.

نکته‌ها

در Java، بهترین شیوه این است که به‌جای متدهای کلاسی از متدهای نمونه‌ای استفاده شود. با این حال، شرایطی وجود دارد که استفاده از static برای یک تابع کاملاً مناسب است. چون کلاس‌ها در Java برای تغییر بسته‌اند (یعنی برخلاف زبان‌های دیگری مانند Ruby یا JavaScript نمی‌توانید به کلاسی خارج از تعریفش عضو اضافه کنید)، نمی‌توانید رفتار جدیدی را مستقیماً به کلاس اضافه کنید. اگر با این حال بخواهید برای یک نوع مشخص رفتاری تعریف کنید، چه باید کرد؟ راه‌حل اصطلاحی در این حالت نوشتن یک متد ابزاری است. مجموعه‌هایی از این نوع متدها را اغلب «کلاس‌های ابزاری» می‌نامند. نمونه‌هایی از این کلاس‌ها در JRE عبارت‌اند از Arrays و Collections. در این تمرین می‌خواهیم یک List متدهای map()، reduce()، filter() و غیره داشته باشد. اما چنین متدهایی ندارد، بنابراین از متدهای static استفاده می‌کنیم.

متدهای foldLeft و foldRight از توابع «fold» هستند؛ مفهومی که در دنیای برنامه‌نویسی تابعی به‌خوبی شناخته شده است، اما در دنیای شیءگرا کمتر. برای پیش‌زمینه‌ی کلی و نکته‌هایی درباره‌ی امضا و پیاده‌سازی صفحه‌ی ویکی‌پدیا درباره‌ی fold را ببینید.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Java Exercism

آماده‌اید عملیات لیست را شروع کنید؟

در Exercism ثبت‌نام کنید تا Java را همراه با 26 مفهوم158 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.

بررسی عمیق عملیات لیست!

از مقدمه‌ای عملی بر بازگشت لذت ببرید، جایگزین‌های دستوری و تابعی «عملیات لیست» را بررسی کنید و به بازگشت دنباله‌ای و توابع انباره عمیق شوید.