ساختمان داده Collection در جاوا: راهنمای جامع
جاوا به عنوان یکی از محبوبترین زبانهای برنامهنویسی، ابزارهای قدرتمندی برای مدیریت دادهها در اختیار توسعهدهندگان قرار میدهد. یکی از این ابزارها، فریمورک Collection است که مجموعهای از کلاسها و رابطها برای ذخیره، دستکاری و مدیریت مجموعه دادهها ارائه میدهد. در این مقاله، به بررسی ساختمان داده Collection در جاوا، کاربردها، مزایا، معایب و مثالهای عملی آن خواهیم پرداخت.
ساختمان داده Collection در جاوا چیست؟
ساختمان داده Collection در جاوا مجموعهای از کلاسها و رابطها است که برای ذخیره، دستکاری و مدیریت گروهی از اشیاء استفاده میشود. این فریمورک به توسعهدهندگان امکان میدهد تا به سادگی و کارآمدی با دادههای مختلف کار کنند.
ساختمان داده Collection در جاوا به سه دسته اصلی تقسیم میشود:
١. رابط List
رابط List برای نمایش مجموعهای از عناصر مرتب شده استفاده میشود. هر عنصر در لیست دارای یک اندیس است که برای دسترسی به آن استفاده میشود.
- ArrayList: لیستی قابل تغییر است که از آرایه برای ذخیره عناصر استفاده میکند.
- LinkedList: لیستی قابل تغییر است که از لینکها برای اتصال عناصر استفاده میکند.
- Vector: لیستی قدیمیتر و همگامسازی شده است که به ندرت استفاده میشود.
مثال کاربردی از رابط List در ساختمان داده Collection در Java
فرض کنید میخواهید لیستی از دانشآموزان در یک کلاس درس را به همراه نام، سن و نمره آنها ذخیره کنید. برای این کار میتوانید از رابط List در ساختمان داده Collection جاوا استفاده کنید.
مرحله 1: تعریف کلاس Student
public class Student { private String name; private int age; private double score; public Student(String name, int age, double score) { this.name = name; this.age = age; this.score = score; } // Getters and setters omitted for brevity }
در این کد، کلاس Student با سه فیلد تعریف شده است: name، age و score. این فیلدها به ترتیب نام دانشآموز، سن و نمره او را ذخیره میکنند.
مرحله 2: ایجاد لیست دانشآموزان
List students = new ArrayList<>(); students.add(new Student("علی", 15, 18.5)); students.add(new Student("محمد", 16, 19.2)); students.add(new Student("حسن", 17, 17.8));
در این کد، یک ArrayList با نام students ایجاد میشود. سپس سه دانشآموز جدید با استفاده از سازنده کلاس Student به لیست اضافه میشوند.
مرحله 3: پیمایش لیست دانشآموزان
for (Student student : students) { System.out.println("نام: " + student.getName()); System.out.println("سن: " + student.getAge()); System.out.println("نمره: " + student.getScore()); System.out.println("------------------------"); }
در این کد، یک حلقه for each برای پیمایش لیست دانشآموزان استفاده میشود. داخل حلقه، اطلاعات هر دانشآموز چاپ میشود.
مرحله 4: جستجو در لیست دانشآموزان
String studentName = "حسن"; for (Student student : students) { if (student.getName().equals(studentName)) { System.out.println("دانشآموز مورد نظر یافت شد:"); System.out.println("نام: " + student.getName()); System.out.println("سن: " + student.getAge()); System.out.println("نمره: " + student.getScore()); break; } }
در این کد، نام دانشآموزی که میخواهیم پیدا کنیم در متغیر studentName ذخیره میشود. سپس با استفاده از یک حلقه for each، لیست دانشآموزان را جستجو میکنیم. اگر دانشآموز مورد نظر پیدا شد، اطلاعات آن چاپ میشود.
مرحله 5: حذف دانشآموز از لیست
String studentName = "محمد"; for (int i = 0; i < students.size(); i++) { Student student = students.get(i); if (student.getName().equals(studentName)) { students.remove(i); System.out.println("دانشآموز " + studentName + " از لیست حذف شد."); break; } }
در این کد، نام دانشآموزی که میخواهیم حذف کنیم در متغیر studentName ذخیره میشود. سپس با استفاده از یک حلقه for، لیست دانشآموزان را پیمایش میکنیم. اگر دانشآموز مورد نظر پیدا شد، از لیست حذف میشود.
شرح کامل کد:
- در این مثال، از کلاس Student برای نشان دادن اطلاعات هر دانشآموز استفاده شده است. این کلاس شامل سه فیلد name، age و score است که به ترتیب نام، سن و نمره دانشآموز را ذخیره میکنند.
- از ArrayList برای ذخیره لیستی از دانشآموزان استفاده شده است. ArrayList یک کلاس Collection است که به شما امکان میدهد عناصر را به لیست اضافه، حذف و جستجو کنید.
- در این مثال، سه دانشآموز به لیست اضافه شده است.
- با استفاده از یک حلقه for each، لیست دانشآموزان پیمایش و اطلاعات هر دانشآموز چاپ میشود.
- در این مثال، دانشآموزی با نام “حسن” در لیست جستجو میشود. اگر دانشآموز پیدا شد، اطلاعات آن چاپ میشود.
- در این مثال، دانشآموزی با نام “محمد” از لیست حذف میشود.
۲. رابط Set
رابط Set برای نمایش مجموعهای از عناصر منحصر به فرد استفاده میشود. ترتیب عناصر در ست مشخص نیست.
- HashSet: ستی که از جدول هش برای ذخیره عناصر استفاده میکند.
- TreeSet: ستی که عناصر را بر اساس ترتیب طبیعی یا مقایسای تعریف شده مرتب میکند.
- LinkedHashSet: ستی که ترتیب درج عناصر را حفظ میکند.
مثال کاربردی از رابط Set در ساختمان داده Collection
فرض کنید میخواهید لیستی از میوهها را به همراه نام و رنگ آنها ذخیره کنید. برای این کار میتوانید از رابط Set در ساختمان داده Collection جاوا استفاده کنید.
مرحله 1: تعریف کلاس Fruit
public class Fruit { private String name; private String color; public Fruit(String name, String color) { this.name = name; this.color = color; } // Getters and setters omitted for brevity }
در این کد، کلاس Fruit با دو فیلد تعریف شده است: name و color. این فیلدها به ترتیب نام میوه و رنگ آن را ذخیره میکنند.
مرحله 2: ایجاد مجموعه میوهها
Set fruits = new HashSet<>(); fruits.add(new Fruit("سیب", "قرمز")); fruits.add(new Fruit("موز", "زرد")); fruits.add(new Fruit("پرتقال", "نارنجی"));
در این کد، یک HashSet با نام fruits ایجاد میشود. سپس سه میوه جدید با استفاده از سازنده کلاس Fruit به مجموعه اضافه میشوند.
مرحله 3: پیمایش مجموعه میوهها
for (Fruit fruit : fruits) { System.out.println("نام: " + fruit.getName()); System.out.println("رنگ: " + fruit.getColor()); }
در این کد، یک حلقه for each برای پیمایش مجموعه میوهها استفاده میشود. داخل حلقه، اطلاعات هر میوه چاپ میشود.
مرحله 4: بررسی وجود میوه در مجموعه
String fruitName = "گریپ فروت"; if (fruits.contains(new Fruit(fruitName, "صورتی"))) { System.out.println("میوه " + fruitName + " در مجموعه وجود دارد."); } else { System.out.println("میوه " + fruitName + " در مجموعه وجود ندارد."); }
در این کد، نام میوهای که میخواهیم بررسی کنیم در متغیر fruitName ذخیره میشود. سپس با استفاده از متد contains، بررسی میکنیم که آیا میوه مورد نظر در مجموعه وجود دارد یا خیر.
مرحله 5: حذف میوه از مجموعه
String fruitName = "موز"; if (fruits.remove(new Fruit(fruitName, "زرد"))) { System.out.println("میوه " + fruitName + " از مجموعه حذف شد."); } else { System.out.println("میوه " + fruitName + " در مجموعه یافت نشد."); }
در این کد، نام میوهای که میخواهیم حذف کنیم در متغیر fruitName ذخیره میشود. سپس با استفاده از متد remove، میوه مورد نظر را از مجموعه حذف میکنیم.
شرح کامل کد:
- در این مثال، از کلاس Fruit برای نشان دادن اطلاعات هر میوه استفاده شده است. این کلاس شامل دو فیلد name و color است که به ترتیب نام و رنگ میوه را ذخیره میکنند.
- از HashSet برای ذخیره مجموعهای از میوهها استفاده شده است. HashSet یک کلاس Set است که به شما امکان میدهد عناصر را به مجموعه اضافه، حذف و بررسی کنید که آیا عنصر خاصی در مجموعه وجود دارد یا خیر.
- در این مثال، سه میوه به مجموعه اضافه شده است.
- با استفاده از یک حلقه for each، مجموعه میوهها پیمایش و اطلاعات هر میوه چاپ میشود.
- در این مثال، وجود میوهای با نام “گریپ فروت” در مجموعه بررسی میشود.
- در این مثال، میوهای با نام “موز” از مجموعه حذف میشود.
۳. رابط Map
رابط Map برای نمایش نگاشت بین کلیدها و مقادیر استفاده میشود. هر کلید باید منحصر به فرد باشد.
- HashMap: مپی که از جدول هش برای ذخیره عناصر استفاده میکند.
- TreeMap: مپی که عناصر را بر اساس ترتیب طبیعی یا مقایسای تعریف شده مرتب میکند.
- LinkedHashMap: مپی که ترتیب درج عناصر را حفظ میکند.
مثال کاربردی از رابط Map در ساختمان داده Collection
فرض کنید میخواهید اطلاعات مربوط به دانشآموزان در یک کلاس درس را به همراه نام، سن و نمره آنها در یک دایره المعارف ذخیره کنید. برای این کار میتوانید از رابط Map در ساختمان داده Collection جاوا استفاده کنید.
مرحله 1: تعریف کلاس Student
public class Student { private String name; private int age; private double score; public Student(String name, int age, double score) { this.name = name; this.age = age; this.score = score; } // Getters and setters omitted for brevity }
در این کد از مثال ساختمان داده Collection در جاوا، کلاس Student با سه فیلد تعریف شده است: name، age و score. این فیلدها به ترتیب نام دانشآموز، سن و نمره او را ذخیره میکنند.
مرحله 2: ایجاد دایره المعارف دانشآموزان
Map<String, Student> students = new HashMap<>(); students.put("علی", new Student("علی", 15, 18.5)); students.put("محمد", new Student("محمد", 16, 19.2)); students.put("حسن", new Student("حسن", 17, 17.8));
در این کد، یک HashMap با نام students ایجاد میشود. سپس سه دانشآموز جدید با استفاده از متد put به دایره المعارف اضافه میشوند. کلید هر دانشآموز نام او و مقادیر آن اطلاعات مربوط به او (سن و نمره) است.
مرحله 3: دسترسی به اطلاعات دانشآموز
String studentName = "حسن"; if (students.containsKey(studentName)) { Student student = students.get(studentName); System.out.println("نام: " + student.getName()); System.out.println("سن: " + student.getAge()); System.out.println("نمره: " + student.getScore()); } else { System.out.println("دانشآموز با نام " + studentName + " یافت نشد."); }
در این کد، نام دانشآموزی که میخواهیم اطلاعات آن را دریافت کنیم در متغیر studentName ذخیره میشود. سپس با استفاده از متد containsKey، بررسی میکنیم که آیا نام دانشآموز در دایره المعارف وجود دارد یا خیر. اگر نام دانشآموز وجود داشته باشد، با استفاده از متد get اطلاعات آن را دریافت میکنیم.
مرحله 4: حذف دانشآموز از دایره المعارف
String studentName = "محمد"; if (students.remove(studentName) != null) { System.out.println("دانشآموز " + studentName + " از دایره المعارف حذف شد."); } else { System.out.println("دانشآموز با نام " + studentName + " یافت نشد."); }
در این کد، نام دانشآموزی که میخواهیم حذف کنیم در متغیر studentName ذخیره میشود. سپس با استفاده از متد remove، دانشآموز مورد نظر را از دایره المعارف حذف میکنیم.
شرح کامل کد:
- در این مثال، از کلاس Student برای نشان دادن اطلاعات هر دانشآموز استفاده شده است. این کلاس شامل سه فیلد name، age و score است که به ترتیب نام، سن و نمره دانشآموز را ذخیره میکنند.
- از HashMap برای ذخیره دایره المعارف دانشآموزان استفاده شده است. HashMap یک کلاس Map است که به شما امکان میدهد کلیدها و مقادیر را به دایره المعارف اضافه، حذف و جستجو کنید.
- در این مثال، سه دانشآموز به دایره المعارف اضافه شده است.
- با استفاده از متد get، اطلاعات مربوط به دانشآموز با نام “حسن” از دایره المعارف دریافت میشود.
- با استفاده از متد remove، دانشآموز با نام “محمد” از دایره المعارف حذف میشود.
کاربردهای ساختمان داده Collection در جاوا
ساختمان داده Collection در جاوا در بسیاری از برنامههای کاربردی استفاده میشود، از جمله:
- ذخیره دادهها: برای ذخیره دادههای مختلف مانند لیست کاربران، محصولات، سفارشات و غیره.
- پردازش دادهها: برای انجام عملیات مختلف بر روی دادهها مانند فیلتر کردن، مرتبسازی، جستجو و غیره.
- ساختارهای داده پیچیدهتر: به عنوان بلوکهای ساختمانی برای ساختارهای داده پیچیدهتر مانند درختها، گرافها و صفها.
مزایا و معایب ساختمان داده Collection در جاوا
مزایا و معایب ساختمان داده کولکشن در جاوا چیست؟ این مزایا و معایب به صورت زیر است:
مزایا:
- سادگی استفاده: فریمورک Collection ارائه دهنده رابطهای ساده و روشهای کارآمد برای مدیریت دادهها است.
- کارایی: بسیاری از پیادهسازیهای Collection بهینه شدهاند تا عملکرد خوبی داشته باشند.
- گستردگی: فریمورک Collection شامل طیف وسیعی از کلاسها و رابطها است که برای انواع مختلف دادهها مناسب است.
معایب:
- پیچیدگی: برخی از ساختمانهای داده Collection مانند TreeMap و TreeSet پیچیدگی زمانی بالاتری برای عملیات دارند.
- مصرف حافظه: برخی از ساختمانهای داده Collection مانند ArrayList ممکن است فضای حافظه زیادی را اشغال کنند.
مثالی از ساختمان داده کولکشن در جاوا
مثال زیر در رابطه با ساختمان داده کولکشن در جاوا اهمیت خاصی دارد:
import java.util.ArrayList; import java.util.List; public class Example { public static void main(String[] args) { List names = new ArrayList<>(); names.add("علی"); names.add("محمد"); names.add("حسن"); for (String name : names) { System.out.println(name); } } }
در این مثال، از یک ArrayList برای ذخیره لیستی از نامها استفاده شده است. سپس با استفاده از یک حلقه for، نامها را چاپ میکنیم.
مثالی جامع و عملی از Collection در جاوا
فرض کنید شما یک فروشگاه آنلاین دارید و میخواهید لیستی از محصولات خود را به همراه قیمت و موجودی آنها در برنامه خود ذخیره کنید. برای این کار میتوانید از یک ArrayList استفاده کنید.
مرحله 1: تعریف کلاس Product
public class Product { private String name; private double price; private int quantity; public Product(String name, double price, int quantity) { this.name = name; this.price = price; this.quantity = quantity; } // Getters and setters omitted for brevity }
در این کد، کلاس Product با سه فیلد تعریف شده است: name، price و quantity. این فیلدها به ترتیب نام محصول، قیمت و موجودی آن را ذخیره میکنند.
مرحله 2: ایجاد لیست محصولات
List products = new ArrayList<>(); products.add(new Product("Laptop", 1200, 10)); products.add(new Product("Smartphone", 500, 20)); products.add(new Product("Tablet", 300, 15));
در این کد، یک ArrayList با نام products ایجاد میشود. سپس سه محصول جدید با استفاده از سازنده کلاس Product به لیست اضافه میشوند.
مرحله 3: پیمایش لیست محصولات
for (Product product : products) { System.out.println("نام محصول: " + product.getName()); System.out.println("قیمت: " + product.getPrice()); System.out.println("موجودی: " + product.getQuantity()); System.out.println("------------------------"); }
در این کد، یک حلقه for each برای پیمایش لیست محصولات استفاده میشود. داخل حلقه، اطلاعات هر محصول چاپ میشود.
مرحله 4: جستجو در لیست محصولات
String productName = "Tablet"; for (Product product : products) { if (product.getName().equals(productName)) { System.out.println("محصول مورد نظر یافت شد:"); System.out.println("نام محصول: " + product.getName()); System.out.println("قیمت: " + product.getPrice()); System.out.println("موجودی: " + product.getQuantity()); break; } }
در این کد، نام محصولی که میخواهیم پیدا کنیم در متغیر productName ذخیره میشود. سپس با استفاده از یک حلقه for each، لیست محصولات را جستجو میکنیم. اگر محصول مورد نظر پیدا شد، اطلاعات آن چاپ میشود.
مرحله 5: حذف محصول از لیست
String productName = "Smartphone"; for (int i = 0; i < products.size(); i++) { Product product = products.get(i); if (product.getName().equals(productName)) { products.remove(i); System.out.println("محصول " + productName + " از لیست حذف شد."); break; } }
در این کد، نام محصولی که میخواهیم حذف کنیم در متغیر productName ذخیره میشود. سپس با استفاده از یک حلقه for، لیست محصولات را پیمایش میکنیم. اگر محصول مورد نظر پیدا شد، از لیست حذف میشود.
شرح کامل کد:
- در این مثال، از کلاس Product برای نشان دادن اطلاعات هر محصول استفاده شده است. این کلاس شامل سه فیلد name، price و quantity است که به ترتیب نام، قیمت و موجودی محصول را ذخیره میکنند.
- از ArrayList برای ذخیره لیستی از محصولات استفاده شده است. ArrayList یک کلاس Collection است که به شما امکان میدهد عناصر را به لیست اضافه، حذف و جستجو کنید.
- در این مثال، سه محصول به لیست اضافه شده است.
- با استفاده از یک حلقه for each، لیست محصولات پیمایش و اطلاعات هر محصول چاپ میشود.
- در این مثال، محصولی با نام “Tablet” در لیست جستجو میشود. اگر محصول پیدا شد، اطلاعات آن چاپ میشود.
- در این مثال، محصولی با نام “Smartphone” از لیست حذف میشود.
نکات مهم:
- Collectionها برای ذخیره، دستکاری و مدیریت گروهی از اشیاء در جاوا استفاده میشوند.
- ArrayList یک Collection محبوب است که برای ذخیره لیستی از عناصر مرتب استفاده میشود.
- میتوانید از حلقههای for each برای پیمایش Collectionها استفاده کنید.
- میتوانید از متدهای various برای جستجو و حذف عناصر از Collection
سوالات متداول
در زیر چند سوال متدوال برای درک بهتر ساختمان داده کولکشن در جاوا آروده شده است:
- چه زمانی از ArrayList و چه زمانی از LinkedList استفاده کنیم؟
از ArrayList زمانی استفاده کنید که به دسترسی تصادفی سریع نیاز دارید، مانند دسترسی به عنصر با اندیس مشخص. از LinkedList زمانی استفاده کنید که به درج و حذف عناصر در ابتدا یا انتهای لیست نیاز دارید.
- تفاوت بین HashSet و TreeSet چیست؟
HashSet عناصر را به صورت بیترتیب ذخیره میکند و دسترسی به آنها سریعتر است. TreeSet عناصر را بر اساس ترتیب طبیعی یا مقایسای تعریف شده مرتب میکند و جستجو در آن کندتر است.
- چه زمانی از HashMap و چه زمانی از TreeMap استفاده کنیم؟
از HashMap زمانی استفاده کنید که به دسترسی سریع به عناصر بر اساس کلید نیاز دارید. از TreeMap زمانی استفاده کنید که نیاز دارید عناصر را بر اساس کلید مرتب کنید.
- چگونه میتوان یک Collection را به آرایه تبدیل کرد؟
برای تبدیل یک Collection به آرایه، میتوانید از متد toArray() استفاده کنید.
- چگونه میتوان یک آرایه را به Collection تبدیل کرد؟
برای تبدیل یک آرایه به Collection، میتوانید از کلاس Arrays و متد asList() استفاده کنید.
نکته: این مقاله تنها یک مقدمه بر ساختمان داده Collection در جاوا است. برای تسلط کامل بر این موضوع، مطالعه بیشتر و تمرین عملی توصیه میشود.
کلام نهایی
ساختمان داده Collection در جاوا ابزاری قدرتمند برای مدیریت دادهها است. با درک انواع مختلف Collection و کاربردهای آنها، میتوانید کدهای خود را بهینه و قابل خواناییتر کنید. انتخاب ساختمان داده مناسب برای هر مسئله بستگی به نیازهای خاص برنامه شما دارد.
آیا آمادهاید تا در دنیای پر رمز و راز برنامه نویسی جاوا غوطهور شوید؟ مکتب خونه با ارائه دورههای جامع و کاربردی آموزش برنامه نویسی و آموزش جاوا، کلید ورود به این دنیای شگفت انگیز را به شما هدیه میدهد. در دورههای جاوا مکتب خونه، از صفر تا صد این زبان قدرتمند را فرا خواهید گرفت و با مفاهیم بنیادی، ساختارهای داده، الگوریتمها و تکنیکهای پیشرفته برنامه نویسی جاوا آشنا خواهید شد.