CodeGym /وبلاگ جاوا /Random-FA /مجموعه ها در جاوا
John Squirrels
مرحله
San Francisco

مجموعه ها در جاوا

در گروه منتشر شد

مجموعه در جاوا چیست؟

یک مجموعه در جاوا به عنوان یک ظرف نشان داده می شود که همه عناصر را در یک واحد واحد گروه بندی می کند. به عنوان مثال ، یک پوشه نامه (گروهی از ایمیل ها)، یک فهرست تلفن (نگاشت نام ها به شماره تلفن).

چارچوب چیست؟

فریم ورک یک پایه یا طرح اولیه است که با استفاده از کلاس‌ها و رابط‌های مختلف ارائه شده شروع به کار بر روی آن می‌کنید. به عنوان مثال ، لاراول یکی از معروف ترین فریم ورک های پی اچ پی است که یک اسکلت اولیه برای برنامه شما فراهم می کند.

چارچوب مجموعه ها در جاوا چیست؟

همه اشیاء به همراه معماری که نشان دهنده و ارائه روش های مختلف برای دستکاری مجموعه ها است در یک شی واحد گروه بندی می شوند. بنابراین چارچوب مجموعه‌ها در جاوا ساختارهای داده‌ای مختلفی را ارائه می‌کند که قبلاً برای ذخیره داده‌ها و روش‌ها پیاده‌سازی شده‌اند تا با ویژگی‌هایی مانند مرتب‌سازی، جستجو، حذف و درج آنها را دستکاری کنید . به عنوان مثال ، شما می خواهید سیستمی را برای برخی از شرکت های تصادفی پیاده سازی کنید تا خدمات را برای مشتریان خود بهبود بخشد، بر اساس اولین سرویس اول. این همچنین به عنوان پیاده سازی FIFO (اول در اولین خروجی) شناخته می شود. حال باید این ساختار داده را پیاده سازی کنیم و سپس از آن برای رسیدن به هدف خود استفاده کنیم. چارچوب مجموعه‌ها یک رابط صف را در اختیار ما قرار می‌دهد که فقط باید آن را وارد کنیم تا پیاده‌سازی کنیم، سپس از آن استفاده کنیم و کارمان تمام شد. پیاده سازی : می توانید تمام مجموعه ها را با استفاده از خط زیر وارد کنید:
import java.util.*;
اگر می خواهید مجموعه خاصی را وارد کنید، از نام بسته دقیق استفاده کنید، مانند:
import java.util.LinkedList;

مزایای مجموعه ها در جاوا

مزایای زیر را دارد.
  1. قبلاً اجرا شده است (صرفه جویی در زمان).
  2. کارایی عملکرد (سرعت و کیفیت).
  3. تلاش برای یادگیری و استفاده از API های جدید را کاهش می دهد.

سلسله مراتب چارچوب مجموعه چیست؟

حالا بیایید سلسله مراتب مجموعه ها را ببینیم، اما ابتدا باید اجزای اساسی این چارچوب را بشناسیم.
  1. رابط ها
  2. کلاس ها (اجرا)
  3. الگوریتم ها

سلسله مراتب چارچوب مجموعه

مجموعه ها در جاوا - 1برای فهمیدن شما:
  1. مجموعه، تنظیم، صف و فهرست همه رابط هستند. Set، Queue و List توسط واسط Collection گسترش می یابند.
  2. PriorityQueue، HashSet، LinkedList و Stack همگی کلاس‌ها یا پیاده‌سازی این رابط‌ها هستند.
  3. اجباری نیست که یک کلاس فقط یک رابط را پیاده سازی کند . LinkedList همچنین رابط Deque را پیاده سازی می کند.

انواع مجموعه ها

فریمورک مجموعه های جاوا انواع مجموعه های زیادی را در خود دارد تا تلاش ما را کاهش دهد. در اینجا لیستی از برخی از مجموعه ها آمده است:
  1. کلاس ArrayList
  2. کلاس LinkedList
  3. فهرست رابط
  4. تنظیم رابط
  5. رابط صف
  6. رابط نقشه
  7. کلاس PriorityQueue
  8. کلاس HashMap
  9. رابط قابل مقایسه
  10. کلاس LinkedHashMap
  11. کلاس TreeMap
  12. جدول هش

رابط های مجموعه

در اینجا به چند رابط مجموعه متداول و سپس چند روش پیاده سازی شده توسط کلاس ها می پردازیم.

رابط مجموعه

این یک پایه اساسی برای چارچوب مجموعه ها است زیرا تمام روش های لازم برای پیاده سازی را ارائه می دهد. نقشه تنها ساختار داده ای است که آن را پیاده سازی نمی کند اما بقیه همه روش های آن را پیاده سازی می کنند. این رابط دارای روش هایی برای دانستن اندازه مجموعه، و اینکه آیا یک شی در مجموعه وجود دارد، اضافه کردن یا حذف اشیاء از مجموعه دارد.

رابط تکرارپذیر

این رابط ریشه برای چارچوب مجموعه ها است، زیرا توسط رابط مجموعه که توسط همه کلاس ها پیاده سازی می شود، گسترش می یابد. یک تکرار کننده برای مجموعه خاص برمی گرداند تا روی آن تکرار شود.

رابط صف

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

تنظیم رابط

مجموعه برای نگهداری عناصر منحصر به فرد در آن استفاده می شود. هرگز شامل عناصر تکراری نمی شود و انتزاع مجموعه ریاضی را برای نمایش مجموعه هایی مانند فرآیندهای در حال اجرا در ماشین مدل می کند.

فهرست رابط

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

رابط Deque

Deque مخفف صف دو سر است که به این معنی است که ما می توانیم عملیات را در هر دو انتها انجام دهیم. ما می توانیم عناصر را از هر دو طرف درج و حذف کنیم. رابط Deque رابط صف را گسترش می دهد. ArrayDeque و LinkedList هر دو رابط Deque را پیاده سازی می کنند. روش هایی را برای درج، حذف و بررسی نمونه از هر دو طرف ارائه می دهد.

رابط نقشه

رابط نقشه نیز بخشی از چارچوب مجموعه ها است اما رابط مجموعه را گسترش نمی دهد. برای ذخیره جفت های کلید-مقدار استفاده می شود. پیاده سازی های اصلی آن HashMap، TreeMap و LinkesHashMap هستند که از جنبه های خاصی مشابه HashSet، TreeSet و LinkedHashSet هستند. همیشه حاوی کلیدهای منحصر به فرد است، اما مقادیر را می توان تکرار کرد. هنگامی که نیاز به افزودن، حذف یا جستجوی یک مورد بر اساس یک کلید دارید، مفید است. روش های اساسی مانند قرار دادن ، دریافت ، حذف ، اندازه ، خالی کردن و غیره را در اختیار ما قرار می دهد.

روش های رایج این رابط ها

حال به چند روش متداول ارائه شده برای پیاده سازی کلاس های مختلف در این فریم ورک بجز رابط Map نگاه می کنیم.
مواد و روش ها شرح
افزودن بولی عمومی (E e) برای درج یک عنصر در مجموعه استفاده می شود
حذف بولین عمومی (عنصر شی) برای حذف یک عنصر از مجموعه استفاده می شود
اندازه int عمومی() تعداد عناصر یک مجموعه را برمی‌گرداند
بولین عمومی حاوی (عنصر شی) برای جستجوی یک عنصر استفاده می شود
بولین عمومی isEmpty() خالی بودن مجموعه را بررسی می کند
بولین عمومی برابر است (عنصر شی) برابری را بررسی می کند

کلاس های مجموعه

همانطور که می دانیم فریم ورک دارای رابط های مختلفی است که توسط کلاس های زیادی در داخل آن پیاده سازی می شود. حالا بیایید نگاهی به برخی از کلاس های رایج بیندازیم.

LinkedList

این متداول ترین ساختار داده ای است که یک لیست پیوندی مضاعف را برای ذخیره عناصر درون آن پیاده سازی می کند. می تواند عناصر تکراری را ذخیره کند. این رابط Dequeue گسترش یافته توسط رابط Queue و رابط List را پیاده سازی می کند. هماهنگ نیست. اکنون بیایید ببینیم که چگونه مشکل خود را که در بالا بحث شد (مفهوم FIFO) با استفاده از LinkedList حل کنیم. مشکل این است که به مشتریان به روشی که آنها وارد می شوند خدمت رسانی کنیم، یعنی اولین بار به بیرون .

مثال

import java.util.*;

public class LinkedListExample {
    public static void main(String[] args) {
        Queue<String> customerQueue = new LinkedList<String>();
        //Adding customers to the Queue as they arrived
        customerQueue.add("John");
        customerQueue.add("Angelina");
        customerQueue.add("Brooke");
        customerQueue.add("Maxwell");

        System.out.println("Customers in Queue:"+customerQueue);
        //element() => returns head of the queue
        //we will see our first customer and serve him
        System.out.println("Head of the queue i.e first customer: "+customerQueue.element());
        //remove () method =>removes first element(customer) from the queue i.e the customer is served so remove him to see next
        System.out.println("Element removed from the queue: "+customerQueue.remove());
        //poll () => removes and returns the head
        System.out.println("Poll():Returned Head of the queue: "+customerQueue.poll());
        //print the remaining customers in the Queue
        System.out.println("Final Queue:"+customerQueue);
    }
}

خروجی

مشتریان در صف:[جان، آنجلینا، بروک، ماکسول] رئیس صف یعنی اولین مشتری: جان عنصر از صف حذف شد: جان پول ():بازگردانده شده رئیس صف: آنجلینا صف نهایی:[بروک، ماکسول]

ArrayList

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

مثال

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

		// Creating the ArrayList
		ArrayList<String> books = new ArrayList<String>();

		// Adding a book to the list
		books.add("Absalom, Absalom!");
		// Adding a book in array list
		books.add("A Time to Kill");
		// Adding a book to the list
		books.add("The House of Mirth");
		// Adding a book to the list
		books.add("East of Eden");
		// Traversing the list through Iterator
		Iterator<String> itr = books.iterator();
		while (itr.hasNext()) {
			System.out.println(itr.next());
		}
	}
}

خروجی

ابشالوم، ابشالوم! زمانی برای کشتن خانه میرث در شرق عدن

HashSet

این رابط Set را پیاده سازی می کند و هرگز حاوی مقادیر تکراری نیست. جدول هش را برای ذخیره مقادیر پیاده سازی می کند. همچنین به مقادیر تهی اجازه می دهد. هرگز ترتیب درج را حفظ نمی کند، اما عملکرد زمان ثابتی را برای افزودن ، حذف ، اندازه و حاوی متدها ارائه می دهد. برای عملیات جستجو بهترین است و همگام نیست.

مثال

import java.util.*;
class HashSetExample{
    public static void main(String args[]){
        //creating HashSet and adding elements to it
        HashSet<Integer> hashSet=new HashSet();
        hashSet.add(1);
        hashSet.add(5);
        hashSet.add(4);
        hashSet.add(3);
        hashSet.add(2);
        //getting an iterator for the collection
        Iterator<Integer> i=hashSet.iterator();
        //iterating over the value
        while(i.hasNext())  {
            System.out.println(i.next());
        }
    }
}

خروجی

1 2 3 4 5
همانطور که می بینید ترتیب درج را حفظ نمی کند.

ArrayDeque

این رابط Deque را پیاده سازی می کند، بنابراین اجازه می دهد تا عملیات از هر دو طرف انجام شود. مقادیر null را اجازه نمی دهد. وقتی به صورت Stack و LinkedList اجرا می شود، سریعتر از Stack و LinkedList است. ArrayDeque هیچ محدودیتی در اندازه ندارد زیرا رشد می کند و طبق نیازها کوچک می شود. ناهمگام است، به این معنی که از نظر نخ ایمن نیست. برای ایمن نگه داشتن آن، باید منطق خارجی را پیاده سازی کنیم.

مثال

import java.util.*;
public class ArrayDequeExample {
   public static void main(String[] args) {
       //creating Deque and adding elements
       Deque<String> deque = new ArrayDeque<String>();
       //adding an element
       deque.add("One");
       //adding an element at the start
       deque.addFirst("Two");
       //adding an element at the end
       deque.addLast("Three");
       //traversing elements of the collection
       for (String str : deque) {
            System.out.println(str);
       }
   }
}

خروجی

دو یک سه

HashMap

این پیاده سازی رابط نقشه است که توسط جدول هش پشتیبانی می شود. جفت های کلید-مقدار را ذخیره می کند. مقادیر null را اجازه نمی دهد. هماهنگ نیست. هرگز دستور درج را تضمین نمی کند. عملکرد زمان ثابتی را برای روش هایی مانند get و put ارائه می دهد . عملکرد آن به دو عامل بستگی دارد - ظرفیت اولیه و ضریب بار . ظرفیت تعداد سطل های جدول هش است بنابراین ظرفیت اولیه تعداد سطل های تخصیص داده شده در زمان ایجاد است. ضریب بار اندازه گیری است که نشان می دهد یک جدول هش چقدر می تواند پر شود قبل از اینکه ظرفیت آن افزایش یابد. روش Rehash برای افزایش ظرفیت استفاده می شود و عمدتاً تعداد سطل ها را دو برابر می کند.

مثال

import java.util.*;
public class HashMapExample{
    public static void main(String args[]){
        //creating a HashMap
        HashMap<Integer,String> map=new HashMap<Integer,String>();
        //putting elements into the map
        map.put(1,"England");
        map.put(2,"USA");
        map.put(3,"China");

        //get element at index 2
        System.out.println("Value at index 2 is: "+map.get(2));
        System.out.println("iterating map");
        //iterating the map
        for(Map.Entry m : map.entrySet()){
            System.out.println(m.getKey()+" "+m.getValue());
        }
    }
}

خروجی

مقدار در شاخص 2 عبارت است از: نقشه تکراری چین 1 انگلستان 2 ایالات متحده آمریکا 3 چین

الگوریتم ها

چارچوب مجموعه ها الگوریتم های مختلفی را برای عملیات های مختلف در اختیار ما قرار می دهد تا در مجموعه ها اعمال شود. در اینجا به بررسی این الگوریتم ها خواهیم پرداخت که کدام عملیات اصلی را پوشش می دهند. این شامل الگوریتم های مربوط به:
  1. مرتب سازی
  2. جستجوکردن
  3. به هم زدن
  4. دستکاری معمول داده ها
  5. ترکیب بندی
  6. یافتن ارزش های افراطی
برای درک بهتر در مورد الگوریتم مرتب سازی بحث خواهیم کرد.

مرتب سازی

الگوریتم مرتب سازی یک لیست را بر اساس یک رابطه مرتب سازی مجدد ترتیب می دهد. دو شکل از روابط ارائه شده است.
  1. سفارش طبیعی
  2. ترتیب مقایسه

سفارش طبیعی

در نظم طبیعی یک لیست بر اساس عناصر آن مرتب می شود.

ترتیب مقایسه

در این شکل از سفارش یک پارامتر اضافی که یک مقایسه کننده است به همراه لیست ارسال می شود. یک الگوریتم مرتب‌سازی ادغام کمی بهینه‌شده برای مرتب‌سازی استفاده می‌شود که سریع و پایدار است زیرا زمان اجرای n log(n) را تضمین می‌کند و عناصر مساوی را دوباره ترتیب نمی‌دهد. ما از همان مثال ArrayList برای نشان دادن مرتب‌سازی استفاده خواهیم کرد.

مثال

import java.util.*;
public class SortingExample{
    public static void main(String args[]){
        //Creating arraylist
        ArrayList<String> books=new ArrayList<String>();
        //Adding a book to the arraylist
        books.add("A Time to Kill");
        //Adding a book to the arraylist
        books.add("Absalom, Absalom!");
        //Adding a book to the arraylist
        books.add("The House of Mirth");
        //Adding a book to the arraylist
        books.add("East of Eden");
        //Traversing list through Iterator before sorting
        Iterator itrBeforeSort=books.iterator();
        while(itrBeforeSort.hasNext()){
            System.out.println(itrBeforeSort.next());
        }
        //sorting the books
        Collections.sort(books);
        System.out.println("After sorting the books");
        //Traversing list through Iterator after sorting
        Iterator itr=books.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

خروجی

زمانی برای کشتن ابشالوم، ابشالوم! خانه میرث شرق عدن پس از مرتب سازی کتاب ها زمانی برای کشتن ابشالوم، ابشالوم! شرق عدن خانه میرث

نتیجه

امیدواریم تا کنون متوجه شده باشید که فریمورک مجموعه های جاوا چیست، رابط ها و کلاس های آن چیست و چگونه کلاس های مختلف آن را پیاده سازی کنید. همیشه می توانید از این فریم ورک برای کاهش تلاش خود در جاوا استفاده کنید. با خیال راحت تمرین کنید و هر زمان که به کمک بیشتری نیاز داشتید به اینجا برگردید. یادگیری مبارک!
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION