فهرست سرفصل‌های Java
خونه (HOME) مقدمه (Intro) شروع کار (Get Started) نحوه نگارش (Syntax) دستورات (Statements) خروجی (Output) چاپ اعداد (Print Numbers) کامنت ها (Comments) متغیرها (Variables) چاپ متغیرها (Print Variables) چندین متغیر (Multiple Variables) شناسه ها (Identifiers) ثابت ها / فاینال (Constants (Final)) نمونه های واقعی (Real-Life Examples) انواع داده (Data Types) اعداد (Numbers) بولی ها (Booleans) کاراکترها (Characters) نمونه واقعی (Real-Life Example) غیراولیّه ها (Non-primitive Types) کلیدواژه var (The var Keyword) تبدیل نوع (Type Casting) حسابی (Arithmetic) انتساب (Assignment) مقایسه (Comparison) منطقی (Logical) اولویت (Precedence) رشته ها (Strings) به هم چسباندن (Concatenation) اعداد و رشته ها (Numbers and Strings) کاراکترهای ویژه (Special Characters) بولی ها (Booleans) شرط ها If...Else (If...Else) else else if حالت کوتاه if...else (Short Hand If...Else) عملگرهای منطقی (Logical Operators) نمونه های واقعی (Real-Life Examples) سوییچ (Switch) حلقه while (While Loop) نمونه های واقعی while (Real-Life Examples) حلقه for (For Loop) حلقه های تو در تو (Nested Loops) حلقه foreach (For-Each Loop) نمونه های واقعی for (Real-Life Examples) شکستن/ادامه (Break/Continue) آرایه ها (Arrays) حلقه روی آرایه (Loop Through an Array) نمونه های واقعی آرایه (Real-Life Examples) آرایه های چندبعدی (Multidimensional Arrays) متدها (Methods) پارامترهای متد (Method Parameters) مقادیر بازگشتی (Return Values) سربارگذاری متد (Method Overloading) اسکوپ (Scope) بازگشتی (Recursion) شی ءگرایی (OOP) کلاس ها/اشیاء (Classes/Objects) خصوصیات کلاس (Class Attributes) متدهای کلاس (Class Methods) سازنده ها (Constructors) this (this Keyword) تعدیل کننده ها (Modifiers) تعدیل کننده های دسترسی (Access Modifiers) تعدیل کننده های غیردسترسی (Non-Access Modifiers) کپسوله سازی (Encapsulation) پکیج ها / API (Packages / API) ارث بری (Inheritance) چندریختی (Polymorphism) super (super Keyword) کلاس های درونی (Inner Classes) انتزاع (Abstraction) اینترفیس (Interface) ناشناس (Anonymous) enumها (Enum) سازنده در enum (Enum Constructor) ورودی کاربر (User Input) تاریخ (Date) خطاها (Errors) دیباگ (Debugging) استثناها (Exceptions) چند استثنا (Multiple Exceptions) try-with-resources کار با فایل (Files) ایجاد فایل (Create Files) نوشتن فایل (Write Files) خواندن فایل (Read Files) حذف فایل (Delete Files) جریان های I/O (I/O Streams) FileInputStream FileOutputStream BufferedReader BufferedWriter ساختار داده (Data Structures) کالکشن ها (Collections) لیست (List) آرِیلیست (ArrayList) لینکدلیست (LinkedList) مرتب سازی لیست (List Sorting) مجموعه (Set) هش ست (HashSet) تری ست (TreeSet) لینکدهش ست (LinkedHashSet) نقشه (Map) هش مپ (HashMap) تری مپ (TreeMap) لینکدهش مپ (LinkedHashMap) ایتراتور (Iterator) الگوریتم ها (Algorithms) کلاس های بسته بندی (Wrapper Classes) جنریک ها (Generics) انوتیشن ها (Annotations) عبارات باقاعده (RegEx) رشته ها (Threads) لامبدا (Lambda) مرتب سازی پیشرفته (Advanced Sorting) پروژه ها (Projects) چگونه ها (How Tos) جمع دو عدد (Add Two Numbers) جابجایی دو متغیر (Swap Two Variables) زوج یا فرد (Even or Odd Number) برعکس کردن عدد (Reverse a Number) مثبت یا منفی (Positive or Negative) ریشه مربع (Square Root) مساحت مستطیل (Area of Rectangle) درجه سلسیوس به فارنهایت (Celsius to Fahrenheit) جمع ارقام (Sum of Digits) عدد آرمسترانگ (Check Armstrong Num) عدد تصادفی (Random Number) شمارش کلمات (Count Words) شمارش حروف صدادار (Count Vowels in a String) حذف حروف صدادار (Remove Vowels) شمارش ارقام در رشته (Count Digits in a String) برعکس کردن رشته (Reverse a String) بررسی پالیندروم (Palindrome Check) بررسی اَناگرام (Check Anagram) تبدیل رشته به آرایه (Convert String to Array) حذف فاصله های خالی (Remove Whitespace) شمارش فراوانی کاراکتر (Count Character Frequency) جمع عناصر آرایه (Sum of Array Elements) میانگین آرایه (Find Array Average) مرتب سازی آرایه (Sort an Array) کوچک ترین عنصر (Find Smallest Element) بزرگ ترین عنصر (Find Largest Element) ادغام دو آرایه (Merge Two Arrays) حذف تکراری ها (Remove Duplicates) پیدا کردن مقادیر تکراری (Find Duplicates) درهم زدن آرایه (Shuffle an Array) فاکتوریل (Factorial of a Number) دنباله فیبوناچی (Fibonacci Sequence) ب.م.م (Find GCD) تشخیص اول بودن (Check Prime Number) حلقه روی ArrayList (ArrayList Loop) حلقه روی HashMap (HashMap Loop) حلقه روی Enum (Loop Through an Enum) مرجع جاوا (Reference) کلیدواژه ها (Keywords) assert abstract boolean break byte case catch char class continue default do double else enum exports extends final finally float for if implements import instanceof int interface long module native new package private protected public return requires short static super switch synchronized this throw throws transient try var void volatile while متدهای رشته (String Methods) charAt() codePointAt() codePointBefore() codePointCount() compareTo() compareToIgnoreCase() concat() concat() contentEquals() contentEquals() endsWith() equals() equalsIgnoreCase() format() getBytes() getChars() hashCode() indexOf() isEmpty() join() lastIndexOf() length() matches() matches() regionMatches() replace() replaceAll() replaceFirst() split() subSequence() substring() toCharArray() toLowerCase() toString() toUpperCase() trim() valueOf() متدهای ریاضی (Math Methods) abs() acos() addExact() atan2() cbrt() ceil() copySign() cos() cosh() exp() expm1() getExponent() hypot() incrementExact() log() log10() log1p() max() min() multiplyExact() negateExact() nextAfter() nextDown() nextUp() pow() random() rint() round() scalb() signum() sin() sinh() sqrt() subtractExact() tan() tanh() toDegrees() toIntExact() toRadians() ulp() روش های خروجی (Java Output Methods) print() printf() println() روش های آرایه ها (Java Arrays Methods) compare() equals() sort() fill() length روش های ArrayList (Java ArrayList Methods) add() addAll() clear() clone() contains contains contains contains contains contains iterator() lastIndexOf() listIterator() remove() removeAll() removeIf() replaceAll() retainAll() retainAll() set() size() sort() spliterator() toArray() trimToSize() trimToSize() روش های LinkedList (Java LinkedList Methods) add() add() addAll() clear() clone() contains forEach() get() getFirst() getLast() indexOf() isEmpty() iterator() lastIndexOf() lastIndexOf() listIterator() remove()
Java

Java — مرتب سازی پیشرفته (Advanced Sorting)

آخرین بروزرسانی: 1404/08/05

مرتب سازی پیشرفته (Advanced Sorting)

مرتب سازی پیشرفته یعنی تعریف قانونِ مرتب سازی برای اشیاء. همچنین می توانیم ترتیب متن و عدد را عوض کنیم. در جاوا این کار با «مقایسه گر (Comparator)» و «قابل مقایسه (Comparable)» انجام می شود.

چرا به مرتب سازی پیشرفته نیاز داریم؟

وقتی لیستِ شیء داریم، باید قانون بدهیم. مثلاً ماشین ها بر اساس سال مرتب شوند. بنابراین مرتب سازی معنی دار می شود.

Comparator چیست؟

«مقایسه گر (Comparator)» یک شیء با متد compare() است. این متد دو شیء می گیرد و عدد برمی گرداند: منفی یعنی اولی جلوتر، مثبت یعنی دومی جلوتر، صفر یعنی برابر.

// Sort Car objects by year
class SortByYear implements Comparator {
  public int compare(Object obj1, Object obj2) {
    Car a = (Car) obj1;
    Car b = (Car) obj2;
    if (a.year < b.year) {
      return -1;
    }
    if (a.year > b.year) {
      return 1;
    }
    return 0;
  }
}

مشاهده در ادیتور

برای استفاده، مقایسه گر را به متد مرتب سازی بده.

Comparator myComparator = new SortByYear();
Collections.sort(myCars, myComparator);

مشاهده در ادیتور

مثال کاملِ Comparator

در این مثال، لیستِ ماشین ها بر اساس سال مرتب می شود.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Car {
  public String brand;
  public String model;
  public int year;
  public Car(String b, String m, int y) {
    brand = b;
    model = m;
    year = y;
  }
}
class SortByYear implements Comparator {
  public int compare(Object obj1, Object obj2) {
    Car a = (Car) obj1;
    Car b = (Car) obj2;
    if (a.year < b.year) {
      return -1;
    }
    if (a.year > b.year) {
      return 1;
    }
    return 0;
  }
}
public class Main {
  public static void main(String[] args) {
    ArrayList<Car> myCars = new ArrayList<Car>();
    myCars.add(new Car("BMW", "X5", 1999));
    myCars.add(new Car("Honda", "Accord", 2006));
    myCars.add(new Car("Ford", "Mustang", 1970));
    Comparator myComparator = new SortByYear();
    Collections.sort(myCars, myComparator);
    for (Car c : myCars) {
      System.out.println(c.brand + " " + c.model + " " + c.year);
    }
  }
}

مشاهده در ادیتور

استفاده از لامبدا برای Comparator

برای کوتاه تر شدن کد، از «لامبدا (Lambda)» استفاده کن.

Collections.sort(myCars, (obj1, obj2) -> {
  Car a = (Car) obj1;
  Car b = (Car) obj2;
  if (a.year < b.year) {
    return -1;
  }
  if (a.year > b.year) {
    return 1;
  }
  return 0;
});

مشاهده در ادیتور

قوانین ویژه مرتب سازی

با Comparator می توان قانون خاص ساخت. مثلاً همه زوج ها قبلِ فردها بیایند.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class SortEvenFirst implements Comparator {
  public int compare(Object obj1, Object obj2) {
    Integer a = (Integer) obj1;
    Integer b = (Integer) obj2;
    boolean aIsEven = (a % 2) == 0;
    boolean bIsEven = (b % 2) == 0;
    if (aIsEven == bIsEven) {
      if (a < b) {
        return -1;
      }
      if (a > b) {
        return 1;
      }
      return 0;
    } else {
      if (aIsEven) {
        return -1;
      } else {
        return 1;
      }
    }
  }
}
public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> myNumbers = new ArrayList<Integer>();
    myNumbers.add(33);
    myNumbers.add(15);
    myNumbers.add(20);
    myNumbers.add(34);
    myNumbers.add(8);
    myNumbers.add(12);
    Comparator myComparator = new SortEvenFirst();
    Collections.sort(myNumbers, myComparator);
    for (int i : myNumbers) {
      System.out.println(i);
    }
  }
}

مشاهده در ادیتور

Comparable چیست؟

«قابل مقایسه (Comparable)» یعنی خود شیء قانون مقایسه دارد. متد آن compareTo() است. بازهم مقدار منفی، مثبت، یا صفر برمی گرداند.

class Car implements Comparable {
  public String brand;
  public String model;
  public int year;
  public int compareTo(Object obj) {
    Car other = (Car) obj;
    if (year < other.year) {
      return -1;
    }
    if (year > other.year) {
      return 1;
    }
    return 0;
  }
}

مشاهده در ادیتور

مثال کامل با Comparable

اینجا کلاس Car خودش قابل مقایسه است. سپس Collections.sort() بدون Comparator کار می کند.

import java.util.ArrayList;
import java.util.Collections;
class Car implements Comparable {
  public String brand;
  public String model;
  public int year;
  public Car(String b, String m, int y) {
    brand = b;
    model = m;
    year = y;
  }
  public int compareTo(Object obj) {
    Car other = (Car) obj;
    if (year < other.year) {
      return -1;
    }
    if (year > other.year) {
      return 1;
    }
    return 0;
  }
}
public class Main {
  public static void main(String[] args) {
    ArrayList<Car> myCars = new ArrayList<Car>();
    myCars.add(new Car("BMW", "X5", 1999));
    myCars.add(new Car("Honda", "Accord", 2006));
    myCars.add(new Car("Ford", "Mustang", 1970));
    Collections.sort(myCars);
    for (Car c : myCars) {
      System.out.println(c.brand + " " + c.model + " " + c.year);
    }
  }
}

مشاهده در ادیتور

ترفند مرسوم در مقایسه اعداد

گاهی می توان مقایسه عددی را یک خطی نوشت. این کار کد را کوتاه می کند.

return a.year - b.year;

مشاهده در ادیتور

return b.year - a.year;

مشاهده در ادیتور

Comparator یا Comparable؟

اگر امکان تغییر کلاس را داری، Comparable ساده تر است. اما اگر کد کلاس دست تو نیست، Comparator انعطاف بیشتری می دهد.

گام های تمرینی

  1. کلاس Car را بساز و لیست پر کن.
  2. با Comparator بر اساس مدل مرتب کن.
  3. سپس با Comparable بر اساس سال مرتب کن.

نکته: برای لامبدا، به لامبدا رجوع کن. همچنین برای کار با رشته ها، صفحه عبارات باقاعده را ببین.

جمع بندی سریع

  • قانون را باید مشخص کنی.
  • Comparator بیرون از کلاس است.
  • Comparable داخل کلاس است.
  • لامبدا Comparator را کوتاه می کند.
  • اختلاف سال را می توان یک خطی نوشت.