CodeGym /وبلاگ جاوا /Random-FA /مرتب سازی مجموعه های جاوا ()
John Squirrels
مرحله
San Francisco

مرتب سازی مجموعه های جاوا ()

در گروه منتشر شد
یکی از متداول‌ترین کارکردهایی که ما به‌عنوان توسعه‌دهندگانی که با داده‌ها سروکار دارند، به آن‌ها نیاز داریم مرتب‌سازی است - با این که بتوانیم داده‌هایمان را مرتب کنیم، می‌توانیم الگوریتم‌هایمان را برای اجرای سریع‌تر بهینه‌سازی کنیم و در کسری از زمانی که داده‌ها به آن نیاز دارد، داده‌های مورد نیاز را پیدا کنیم. در غیر این صورت. در درس امروز، در مورد Java Collections sort() صحبت خواهیم کرد. به عنوان یک آزمایش فکری سریع: تصور کنید که در فهرست یک دانشگاه به دنبال نام هستید. ممکن است ده ها هزار دانش آموز در این مدرسه باشند. اگر فهرستی که به شما داده شد به ترتیب حروف الفبا نبود، باید تک تک صفحات را ورق بزنید و با دقت نگاه کنید تا مطمئن شوید که هیچ نامی را در هیچ کجا رد نکرده اید تا در نهایت نام مورد نظر خود را پیدا کنید. از طرف دیگر، اگر فهرست به حروف الفبا باشد، نه تنها باید در جستجوی خود دقت کمتری داشته باشید، بلکه می توانید به راحتی با همان حرف اول به قسمت فهرست بپرید و با جهش های بزرگ به پرش در اطراف صفحات ادامه دهید. تا زمانی که به فردی که به دنبالش بودید فرود بیایید. هرچه داده های بیشتری با آنها کار کنید، مهم تر است که از آن ها تا حد امکان موثر و کارآمد استفاده کنید. در این مقاله، نحوه مرتب‌سازی هر پیاده‌سازی لیست در جاوا (از جمله ArrayList) را با استفاده از روش مرتب‌سازی مجموعه‌ها بررسی خواهیم کرد.

نحوه مرتب سازی ArrayList در جاوا با استفاده از روش مرتب سازی Java Collections

بیایید در مورد روش Java Collections.sort صحبت کنیم. بسته java.util شامل بسیاری از ابزارها و بسته های مفید است که اغلب توسط توسعه دهندگان از جمله ArrayList استفاده می شود. فرض کنید برنامه ساده زیر را دارید:
import java.util.*;
import java.io.*;
class Main{
     public static void main(String[] args){
          List<String> colors = new ArrayList<String>();
          colors.add("Red    ");
          colors.add("Orange");
          colors.add("Green");
          colors.add("Blue");
    }
}
شما می خواهید بتوانید لیست رنگ ها را چاپ کنید، اما به ترتیب حروف الفبا. چگونه ممکن است این کار را انجام دهید؟ با استفاده از java.util.Collections، مرتب سازی به آسانی یک خط است:

Collections.sort(colors);
تا-دا! لیست رنگ های شما اکنون در جای خود مرتب شده است. اگر می خواهید لیست را چاپ کنید، به این ترتیب:

System.out.println(colors);
سپس خروجی زیر را دریافت خواهید کرد:

[Blue, Green, Orange, Red]
چقدر راحت بود؟! استفاده از Collections.sort() برای مرتب کردن لیستی از اعداد صحیح، شناورها یا هر نوع داده ساده دیگری به ترتیب صعودی به همین سادگی است. اما اگر بخواهید به ترتیب نزولی مرتب کنید چه؟ قطعاً مواردی وجود دارد که این امر منطقی است - تصور کنید که لیستی از نمرات آزمون برای یک کلاس خاص دارید و می‌خواهید بفهمید که دانش‌آموزان دارای امتیاز برتر چه کسانی هستند. بسیار منطقی است که فهرست را به ترتیب نزولی مرتب کنید (ابتدا بالاترین امتیازها)، به طوری که پاسخ هایی که به دنبال آن هستید درست در بالای صفحه قرار گیرند. خوشبختانه، Collections.sort()با یک پارامتر دوم اختیاری بازنویسی شده است، که به شما اجازه می دهد فقط این کار را انجام دهید:

sort(List l, Comparator c)
اما مقایسه کننده چیست؟ خوب، مقایسه کننده به سادگی تابعی است که دو ورودی را با هم مقایسه می کند و عددی را برمی گرداند که نشان می دهد کدام ورودی اول است. اگر یک ArrayList از انواع داده های اولیه را مرتب می کنید، مجموعه های جاوا قبلاً یک مقایسه کننده ()reverseOrder در اختیار شما قرار می دهد. می توان آن را اینگونه نامید:

Collections.sort(colors, Collections.reverseOrder());
اکنون رنگ‌ها در جای خود مرتب‌سازی معکوس شده‌اند، به طوری که اگر آن را چاپ می‌کنید، خروجی زیر را دریافت می‌کنید:

[Red, Orange, Green, Blue]

نحوه استفاده از مجموعه ها برای مرتب سازی انواع داده های غیر ابتدایی در جاوا

تا کنون دیده اید که مرتب سازی ArrayLists رشته ها یا int ها در جاوا با استفاده از متد Collections.sort () به آسانی یک خط کد است. اما اغلب، ArrayLists شما انواع داده های غیر ابتدایی را ذخیره می کند. وقتی با داده‌هایی کار می‌کنید که ویژگی‌های پیچیده‌تری دارند، می‌خواهید کلاس‌هایی بنویسید تا این اشیاء و نحوه مقایسه آنها با یکدیگر را با استفاده از ویژگی‌هایشان نشان دهند. برای بررسی مثالی از این موضوع، اجازه دهید مثال مرتب‌سازی فهرستی از رنگ‌ها را دوباره مرور کنیم، اما این بار، به‌جای مرتب‌سازی رشته‌ها، به مرتب‌سازی اشیاء Color می‌پردازیم. کلاس Color اصلی ما ممکن است چیزی شبیه به این باشد:
public class Color{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(String name, int red, int green, int blue){
   	this.name = name;
    	this.r = red;
   	this.g = green;
   	this.b = blue;
	}
}
برای اینکه کلاس Color خود را با Collections.sort() سازگار کنیم، به طوری که Collection ها بتوانند نحوه مقایسه و مرتب کردن اشیاء Color را درک کنند، باید دو تغییر کوچک ایجاد کنیم:
  1. رنگ را به یک شی قابل مقایسه تبدیل کنید (ابزارهای Comparable<Object> را اضافه کنید)
  2. نادیده گرفتن متد compareTo در کلاس (بازنویسی عمومی int compareTo(Object o))
با این تغییرات، کلاس ما اکنون به شکل زیر است:
public class Color implements Comparable<Object>{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(int red int green, int blue, String name){
    	this.r = red;
   	this.g = green;
   	this.b = blue;
   	this.name = name;
	}

	@Override
	public int compareTo(Object o) {
    	Color c = (Color) o;
    	return this.name.compareTo(c.name);
	}
}
توجه داشته باشید که متد CompareTo Color به سادگی متد compareTo را فراخوانی می کند. مرتب سازی به ترتیب حروف الفبا انجام خواهد شد. برای مثال، اگر بخواهیم بر اساس مقدار قرمز به ترتیب صعودی مرتب کنیم، می‌توانیم عبارت return را با return this.r - cr جایگزین کنیم. (اگر بخواهیم بر اساس مقدار سبز به ترتیب نزولی مرتب کنیم، cg بازگشتی خواهد بود - this.g;). حالا اگه زنگ بزنیم

Collections.sort(colors);
در ArrayList از رنگ‌ها به جای رشته‌ها، کار می‌کند، زیرا مجموعه‌ها می‌دانند چگونه اشیاء رنگی را با هم مقایسه کنند. اگر نمی خواهید شیء خود را Comparable<Object> پیاده سازی کنید، می توانید یک مقایسه کننده برای کلاس خود بنویسید و آن را به متد 2 پارامتری Collections.sort() منتقل کنید. یک مقایسه کننده یک متد public int compare (شیء یک، شیء دو) را لغو می کند و متد Collections.sort() از این برای مقایسه اشیا در حین مرتب سازی استفاده می کند. نمونه ای از مقایسه کننده های SortByName و SortByRed در زیر پیاده سازی شده است:
class SortByName implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.name.compareTo(b.name);
	}
}

class SortByRGB implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.r - b.r;
	}
}
با این، اکنون می توانید تماس بگیرید

Collections.sort(colors, new SortByName());
بدون اینکه کلاس Color واقعاً Comparable را پیاده سازی کند، و همچنان کار خواهد کرد. گاهی اوقات، می بینید که این کار به صورت خطی و با استفاده از توابع لامبدا انجام می شود. تابع لامبدا اساساً یک تابع بی نام است که می توانید آن را در خط کدی که آن را فراخوانی می کند تعریف کنید. آنها زمانی مفید هستند که شما فقط نیاز به فراخوانی یک تابع برای یک نمونه خاص دارید و نمی خواهید یک تابع مجزا را در جای دیگر تعریف کنید. مقایسه کننده SortByName را می توان با استفاده از یک تابع لامبدا به صورت خطی تعریف کرد، مانند:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
همانطور که ممکن است حدس بزنید، (a، b) پارامترهای توابع لامبدا (دو شیء مورد مقایسه) را نشان می دهد. -> نشان می دهد که آنچه در زیر می آید یک تعریف تابع لامبدا است. این در مورد آن است! اکنون محبوب ترین روش های مرتب سازی ArrayLists در جاوا را با استفاده از بسته مجموعه ها مشاهده کرده اید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION