آموزش جاوا

کلکسیون ها در جاوا- درس دوم: انواع لیست در جاوا

آشنایی با واسط لیست در جاوا

لیست در جاوا یک نوع کلکسیونه که که این ویژگی ها رو داره :

  • لیست یک کلکسیون مرتب هست. یعنی آیتم های آن دارای اندیس هستند و بهم ریخته نیست. (از این نظر شبیه آرایه است)
  • لیست می تواند آیتم های تکراری هم داشته باشد.
  • اندیس آیتم های لیست از صفر شروع می شود. (از این نظر هم شبیه آرایه است)
  • لیست یک واسط (Interface) هست و از واسط Collection جاوا ارث بری می کند.
  • کلاسهای ArrayList و LinkedList و Vector از واسط لیست ارث بری می کنند.

برای آشنایی با واسط کلکسیون در جاوا، حتما این مطلب رو بخونید.

متد های واسط List در جاوا

واسط لیست، علاوه بر متدهایی که از واسط Collection به ارث می برد، خودش نیز متدهایی برای کار با آیتم های لیست دارد.

توضیحاتنوع بازگشتیمتد
یک آیتم مشخص را در یک اندیس مشخص از لیست جایگذاری می کندvoidadd(int index, E element)
یک آیتم مشخص را به انتهای لیست اضافه می کندbooleanadd(E e)
تمام آیتم های یک کلکسیون را به انتهای لیست اضافه می کندbooleanaddAll(Collection<E> c)
تمام آیتم های یک کلکسیون را به لیست اضافه می کند.
اضافه کردن را از اندیس مشخص شده ی لیست آغاز می کند.
booleanaddAll(int index, Collection<E> c)
تمام آیتم های لیست را حذف می کند.void()clear
یک شئ را با آیتم های لیست مقایسه می کندbooleanequals(Object o)
مقدار هش شده لیست را به صورت عددی بر می گرداندint()hashcode
شیئی که در اندیس مورد نظر لیست وجود دارد را بر می گردانداز نوع شئ داخل لیستget(int index)
اگر لیست خالی باشد True بر می گرداند و بالعکسboolean()isEmpty
اولین اندیس یک آیتم در لیست را بر می گرداند.(فرض کنید از یک آیتم چندتا در لیست موجود باشد) اگر شئ در لیست موجود نباشد عدد (1-) بر می گرداندintindexOf(Object o)
آخرین اندیس یک آیتم در لیست را بر می گرداند.(فرض کنید از یک آیتم چندتا در لیست موجود باشد) اگر شئ در لیست موجود نباشد عدد (1-) بر می گرداندintlastIndexOf(Object o)
تمام آیتم های لیست را با حفظ ترتیب، به صورت آرایه ای از Object ها بر می گرداند. [ ]Object()toArray
تمام آیتم های لیست را با حفظ ترتیب، به صورت آرایه ای از نوع آرایه پاس داده شده بر می گرداند.[ ] TtoArray(T[] a)
اگر آیتم مورد نظر در لیست موجود باشد، Trueبر می گرداندbooleancontains(Object o)
اگر تمام آیتم های کلکسیون مورد نظر در لیست موجو باشد، True بر می گرداندbooleancontainsAll(Collection<?> c)
یک اندیس می گیرد و آیتمی که در آن اندیس وجود دارد را حذف می کندEremove(int index)
نام آیتم را می گیرد و اولین آیتمی که با آن نام در لیست وجود دارد را حذف می کند. booleanremove(Object o)
یک کلکسیون می گیرد و تمام اعضای داخل آن را از داخل لیست حذف می کند booleanremoveAll(Collection<?> c)
تمام آیتم های لیست را با آیتم ورودی تعویض می کندbooleanreplaceAll(UnaryOperator<E> operator)
یک کلکسیون می گیرد و تمام آیتم های لیست را که در کلکسیون موجود نباشد، حذف می کندvoidretainAll(Collection<?> c)
یک آیتم و یک اندیس می گیرد. سپس آیتم موجود در آن اندیس را با آیتم ورودی جایگزین می کندEset(int index, E element)
یک شئ از نوع Comparator می گیرد و لیست را بر اساس آن مرتب می کند voidsort(Comparator<? super E> c)
دو ایندکس شروع و پایان را می گیرد و یک لیست جدید در این رنج بر می گرداند<List<EsubList(int fromIndex, int toIndex)
تعداد آیتم های لیست را شمرده و بر می گرداند. int()size
جدول متدهای لیست در جاوا

انوع لیست در جاوا

1- کلاس ArrayList

کلاس ArrayList یک نوع لیست در جاوا است که واسط List رو پیاده سازی کرده.

در ArrayList امکان درج یا حذف یک آیتم از میانه لیست امکانپذیره. اما اصلاً بهینه نیست. بخاطر اینکه برای درج یا حذف آیتم از داخل لیست، تمام عناصر قبل و یا بعد از اون باید یکی یکی تغییر مکان بدن. این کار در لیست های بزرگ واقعا وقت گیره.

یک نمونه کد ArrayList را در زیر با هم می بینیم:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MainClass {
    public static void main(String[] args) {

        List<Integer> myList = new ArrayList<>();

        myList.add(3);
        myList.add(8);
        myList.add(6);
        myList.add(4);
        myList.add(2);

    }
}

نکته بسیار مهم: در کد بالا می بینید که یک متغیر از نوع List ساخته ایم. و ارجاع ArrayList را درون آن ریخته ایم.

چرا یک متغیر از نوع خود ArrayList نساختیم؟

به دلیل رعایت مهندسی نرم افزار. در این حالت اگر بعداً به این نتیجه برسیم که بجای ArrayListمیبایست از LinkedListاستفاده می کردیم، فقط کافی است یک خط دستور را عوض کنیم. (همان خطی که ArrayList را ایجاد کرده ایم) و چون در بقیه برنامه با یک متغیر از نوع List کار کرده ایم دیگر نیازی به تغییر بقیه کد نخواهد بود.

در کل یادتون باشه هر وقت یک شئ کلکسیون ساختید، ارجاعش رو از نوع واسط کلکسیون مورد نظر قرار بدید!

2- کلاس LinkedList در جاوا

کلاس LinkedList یا لیست پیوندی در جاوا (که توی درس برنامه نویسی پیشرفته دانشگاه، استاد با نسخه ++C اش دهنمونو صاف کرده بود) یکی دیگه از کلاسهاییه که واسط لیست رو پیاده سازی می کنه.

توی لیست پیوندی، هر آیتم آدرس آیتم بعدی رو نگه میداره . به همین دلیل حذف و اضافه از داخل لیست پیوندی، نیازمند جابجایی بقیه عناصر نیست.

به همین دلیل حذف و اضافه کردن آیتم ها در لیست پیوندی خیلی بهینه تر از ArrayList هستش.

اما چون هر کدوم از آیتم ها آدرس مشخصی ندارن (آدرسشون رو از آیتم قبلی می گیرن) رفتن به یک آیتم خاص در لیست پیوندی بسیار ناکارآمد تر از ArrayList خواهد بود.

در کد زیر یک لیست پیوندی ایجاد کردیم و چندتا آیتم بهش اضافه کردیم :

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MainClass {
    public static void main(String[] args) {

        List<Integer> myList = new LinkedList<>();

        myList.add(3);
        myList.add(8);
        myList.add(6);
        myList.add(4);
        myList.add(2);

    }
}

کلاس Iterator در جاوا

iterator که معنی لغوی آن «تکرارکننده» هست در واقع یک دیزاین پترن است.

این دیزاین پترن در جاوا به صورت یک کلاس تعریف شده. و به صورت java.util.Iterator قابل import کردن در برنامه است.

کلاً یک Iterator به درد پیمایش در کلکسیون ها می خورد. Iterator دو متد hasNext , next دارد که بوسیله آنها می تواند وضعیت رکورد بعدی کلکسیون را بفهمد.

در حقیقت همیشه Iterator می تواند به ما بگوید که لیست تمام شده یا هنوز مقدار بعدی دارد. و به همین روش به صورت یک لوپ روی کلکسیون ما پیمایش می کند.

کلکسیون ها هم یک متد به نام iterator دارند. از این متد شئ ساخته شده از کلاس Iterator را در ابتدای لیست قرار می دهد. در حقیقت شئ ساخته شده از Iterator را روی کلکسیون، و در ابتدای کلکسیون نصب می کند.

اینجا را ببینید.

مثلاً فرض کنید ما یک ArrayList میسازیم و برند های گوشی تلفن همراه را داخل آن میریزیم. حالا بوسیله یک Iterator می توانیم داخل این لیست پیمایش کنیم.

مثال زیر رو ببینید

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MainClass {
    public static void main(String[] args) {

        List<String> myList = new ArrayList<>();

        myList.add("Xiaomy");
        myList.add("Apple");
        myList.add("Samsung");
        myList.add("Nokia");
        myList.add("Huawei");

        //using iterator(); Method for Get Iterator from Collection
        Iterator<String> mtIterator = myList.iterator();

        //Looping through a Collection
        while (mtIterator.hasNext()){
            System.out.println(mtIterator.next());
        }

    }
}


خروجی کد بالا به صورت زیر خواهد بود:

Xiaomy
Apple
Samsung
Nokia
Huawei

Process finished with exit code 0

حذف آیتم های لیست بوسیله Iterator

چون iterator توانایی پیمایش در کلکسیون ها را دارد، از آن برای جستجو و حذف آیتم های نا-دلخواه نیز استفاده می شود.

در مثال زیر ما به کمک یک بلوک if که درون Iterator قرار داده ایم، تمام اعداد کوچکتر از ۵ را از لیست حذف کرده ایم:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MainClass {
    public static void main(String[] args) {

        List<Integer> myList = new ArrayList<>();

        myList.add(3);
        myList.add(8);
        myList.add(6);
        myList.add(4);
        myList.add(2);

        //using iterator(); Method for Get Iterator from Collection
        Iterator<Integer> myIterator = myList.iterator();

        //Looping through a Collection
        while (myIterator.hasNext()){
            Integer number = myIterator.next();
            if (number < 5 ){
                myIterator.remove();
            }
        }
        System.out.println(myList);
    }
}


برچسب ها

حامد عسکریان

برنامه نویس و عاشق تکنولوژی

دیدگاهتان را بنویسید

دکمه بازگشت به بالا
بستن
بستن