در این تکلیف شما درباره مجموعه ها بیشتر می آموزید،که لیستها، و یک نوع جدید از مجموعه بهنام نگاشت مخلوط (hash maps) را شامل میشود.
گام ۱: درباره لیست ها بیشتر یاد بگیرید
۱. لیست ها و لیست های قابل تغییر پیش از این معرفی شدند. آنها ساختارداده های بسیار کاربردی هستند، به این دلیل کاتلین تعدادی تابع توکار برای لیست ها ارائه می کند. فهرست جزئی توابع لیست را بررسی کنید. شما می توانید فهرست کامل مستندات برای لیست و لیست های قابل تغییر را در مستندات کاتلین پیدا کنید.
add(element: E)
یک مورد را به لیست قابل تغییر اضافه میکند
remove(element: E)
یک مورد را از لیست قابل تغییر حذف میکند
reversed()
یک نسخه از لیست را با عناصر به ترتیب وارونه برمیگرداند
contains(element: E)
اگر لیست شامل مورد باشد یک true برمیگرداند
subList(fromIndex: Int, toIndex: Int)
بخشی از لیست را باز می گرداند که از اولین شاخص شروع میشود اما شامل شاخص آخر نیست
۲. همچنان با هسته ارتباطی REPL کار میکنید، یک لیست از اعداد بسازید و متد ()sum را روی آن صدا بزنید. این تمامی عناصر را با هم جمع می کند.
val list = listOf(1, 5, 3, 4) println(list.sum())
⇒ 13
۳. یک لیست از رشته ها بسازید و آن را جمع کنید.
val list2 = listOf("a", "bbb", "cc")
println(list2.sum())
⇒ error: none of the following functions can be called with the arguments supplied:
۴. اگر عنصر چیزی باشد که list نتواند به طور مستقیم جمع کند، مانند یک رشته، شما می توانید با استفاده از ()sumby. و یک تابع لامبدا مشخص کنید که چگونه آن را جمع کند، برای مثال برای جمع کردن طول رشتهها. نام پیشفرض یک آرگومان لامبدا it است و اینجا وقتی که لیست را می پیماییم it به هر عنصر از لیست اشاره دارد.
val list2 = listOf("a", "bbb", "cc")
println(list2.sumBy { it.length })
⇒ 6
۵. کارهای بیشتری هست که می توانید با لیست انجام دهید. تنها راه برای دیدن عملکردهای قابل دسترس این است که یک لیست داخل InteliiJ IDEA بسازید، یک نقطه اضافه کنید و بعد به لیست کامل کردن خودکار در راهنمای ابزار نگاه کنید. این برای هر شیای کار می کند. این را با list امتحان کنید.
برای دیدن عملکرد برای یک کلاس، یک شی داخل IntelliJ IDEA بسازید، یک نقطه پس از نام آن اضافه کنید، و بعد به فهرست کامل کننده خودکار درون راهنمای ابزار نگاه کنید. این برای همه شیها کار می کند.
۶. متد ()listIterator را از فهرست انتخاب کنید، و بعد با استفاده از عبارت for همه عناصر که با فاصله از هم جدا شدند را چاپ کنید.
val list2 = listOf("a", "bbb", "cc")
for (s in list2.listIterator()) {
println("$s ")
}
⇒ a bbb cc
گام ۲: از نگاشت مخلوط (hash maps) استفاده کنید
در کاتلین شما تقریباً می توانید هر چیزی را با استفاده از ()hashMapOf به چیز دیگری نگاشت کنید. نگاشت مخلوط به نوعی مانند یک لیست از جفت ها است، که مقدار اول به عنوان کلید عمل میکند.
۱. یک نگاشت مخلوط بسازید که علائم، که کلیدها هستند و بیماری های ماهی، که مقادیر هستند را جور میکند.
val cures = hashMapOf("white spots" to "Ich", "red sores" to "hole disease")
۲. سپس شما می توانید مقدار بیماری را بر اساس کلید علائم، با استفاده از متد ()get، یا حتی مختصرتر با براکت مربعی [ ] بازیابی کنید.
println(cures.get("white spots"))
⇒ Ich
println(cures["red sores"])
⇒ hole disease
۳. یک علامت بیماری که در نگاشت وجود ندارد را امتحان کنید.
println(cures["scale loss"])
⇒ null
اگر یک کلید در نگاشت نباشد، تلاش برای بازگرداندن بیماری مطابق با مقدار null را برمیگرداند. بر اساس داده نگاشت شده، ممکن است هیچ همسانی برای یک کلید وجود نداشته باشد. برای این کاتلین تابع ()getOrDefault را ارائه میکند.
۴. با استفاده از ()getOrDefault جستجو برای کلیدی که همسان ندارد را امتحان کنید.
println(cures.getOrDefault("bloating", "sorry, I don't know"))
⇒ sorry, I don't know
اگر نیاز دارید تا چیزی بیشتر از بازگرداندن یک مقدار انجام دهید، کاتلین تابع ()getOrElse را ارائه میکند.
۵. کد را برای استفاده از ()getOrElse به جای ()getOrDefault تغییر دهید.
println(cures.getOrElse("bloating") {"No cure for this"})
⇒ No cure for this
به جای بازگرداندن یک مقدار پیش فرض ساده، کدی که درون آکولاد { } باشد اجرا میشود. در این مثال else فقط یک رشته بازمیگرداند، اما می توانست مثل پیدا کردن یک صفحه وب با یک درمان برای بیماری و بازگرداندن آن تجملی باشد.
مانند لیست قابل تغییر (mutableListOf) شما می توانید یک نگاشت قابل تغییر (mutableMapOf) بسازید. یک نگاشت قابل تغییر به شما اجازه می دهد مورد ها را اضافه یا حذف کنید. Mutable یعنی قابل تغییر و immutable یعنی غیر قابل تغییر.
۶. یک نگاشت از فهرست موجودی که قابل اصلاح باشد بسازید، که یک رشته ابزار را به تعداد موارد نگاشت میکند. آنرا با تور ماهی گیری (fish net) داخل آن بسازید، بعد با استفاده از ()put سه پودر تمیز کننده مخزن (tank scrubbers) به فهرست موجودی اضافه کنید، و بعد تور ماهی را با ()remove حذف کنید.
val inventory = mutableMapOf("fish net" to 1) inventory.put("tank scrubber", 3) println(inventory.toString()) inventory.remove("fish net") println(inventory.toString())
⇒ {fish net=1, tank scrubber=3}{tank scrubber=3}
مجموعه های غیر قابل تغییر در فضای نخی (threaded) کاربردی هستند جایی که اگر نخ های مختلف به یک مجموعه دسترسی پیدا کنند ممکن است مشکلاتی ایجاد شود.