۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

مرتب سازی اشیاء جاوا با Comparable و Comparator

آیا به دنبال مرتب‌سازی اشیاء جاوا در یک مجموعه، آرایه یا نقشه هستید؟ یاد بگیرید که چگونه از رابط های Comparable و Comparator استفاده کنید و از ClassCastException اجتناب کنید.

آیا به دنبال مرتب‌سازی اشیاء جاوا در یک مجموعه، آرایه یا نقشه هستید؟ یاد بگیرید که چگونه از رابط های Comparable و Comparator استفاده کنید و از ClassCastException اجتناب کنید.

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

با استفاده از رابط Comparable و روش compareTo()، می‌توانیم با استفاده از ترتیب حروف الفبا، طول String، ترتیب حروف الفبا معکوس یا اعداد مرتب کنیم. . رابط Comparator به ما امکان می دهد همین کار را انجام دهیم اما به روشی انعطاف پذیرتر.

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

مرتب‌سازی با رابط‌های Comparable و Comparator جاوا

در اینجا چیزی است که در این مقاله درباره مرتب سازی اشیاء جاوا خواهید آموخت:

  • مرتب‌سازی با مقایسه:
    • مرتب سازی لیست
    • جاوا

    • نحوه عملکرد compareTo() جاوا
    • نحوه مرتب سازی آرایه ها در جاوا
    • مرتب سازی نقشه جاوا با TreeMap
    • مرتب سازی Set جاوا با TreeSet
    • نحوه اجتناب از ClassCastException هنگام مرتب‌سازی
    • استفاده از مقایسه با کلاس‌های اصلی جاوا
  • مرتب سازی لیست
  • جاوا

  • نحوه عملکرد compareTo() جاوا
  • نحوه مرتب سازی آرایه ها در جاوا
  • مرتب سازی نقشه جاوا با TreeMap
  • مرتب سازی Set جاوا با TreeSet
  • نحوه اجتناب از ClassCastException هنگام مرتب‌سازی
  • استفاده از مقایسه با کلاس‌های اصلی جاوا
  • مرتب سازی با مقایسه کننده:
    • استفاده از مقایسه کننده با کلاس های داخلی ناشناس
    • استفاده از مقایسه کننده با عبارات لامبدا
  • استفاده از مقایسه کننده با کلاس های داخلی ناشناس
  • استفاده از مقایسه کننده با عبارات لامبدا
جستجوی معماری عصبی چیست؟ AutoML برای یادگیری عمیق

مرتب سازی با Comparable

ما با نحوه مرتب‌سازی با استفاده از مقایسه. ما زمانی از مقایسه‌پذیر استفاده می‌کنیم که یک مقایسه پیش‌فرض برای شی مورد نظر وجود داشته باشد.

مرتب‌سازی فهرست جاوا

در این مثال اول، Comparable را در کلاس Simpson با استفاده از Simpson در نوع عمومی پیاده‌سازی می‌کنیم:


class Simpson implements Comparable<Simpson> {
    String name;

    Simpson(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Simpson simpson) {
        return this.name.compareTo(simpson.name);
    }
}

public class SimpsonSorting {

     public static void main(String... sortingWithList) {
        List<SimpsonCharacter> simpsons = new ArrayList<>();
        simpsons.add(new SimpsonCharacter("Homer "));
        simpsons.add(new SimpsonCharacter("Marge "));
        simpsons.add(new SimpsonCharacter("Bart "));
        simpsons.add(new SimpsonCharacter("Lisa "));

        Collections.sort(simpsons);
        simpsons.stream().map(s -> s.name).forEach(System.out::print);

        Collections.reverse(simpsons);
        simpsons.stream().forEach(System.out::print);
    }

}

توجه داشته باشید که compareTo() و در یک شی Simpson دیگر ارسال شد. ما همچنین روش toString() را لغو کرده‌ایم، فقط برای آسان‌تر خواندن مثال.

چاپ با toString

روش toString تمام اطلاعات شی را نشان می دهد. وقتی شی را چاپ می کنیم، خروجی همان چیزی است که در toString() پیاده سازی شده است.

نحوه عملکرد compareTo() جاوا

متد compareTo() یک شی داده شده یا نمونه فعلی را با یک شی مشخص شده مقایسه می کند تا ترتیب اشیاء را تعیین کند. در اینجا نگاهی گذرا به نحوه عملکرد compareTo() داریم.

روش compareTo()

اگر مقایسه برگردد …

سپس …

>= ۱

this.name > simpson.name

۰

this.name == simpson.name

<= -1

this.name < simpson.name

اگر مقایسه برگردد ...

سپس ...

>= ۱

this.name > simpson.name

۰

this.name == simpson.name

<= -1

this.name < simpson.name

ما فقط می توانیم از کلاس هایی استفاده کنیم که با متد sort() قابل مقایسه باشند. اگر سعی کنیم Simpson را ارسال کنیم که مقایسه را اجرا نمی کند، یک خطای کامپایل دریافت خواهیم کرد.

بهترین شیوه های ذخیره سازی اشیاء Kubernetes

روش sort() از polymorphism با ارسال هر شیئی که مقایسه است استفاده می کند. سپس اشیاء طبق انتظار مرتب خواهند شد.

خروجی کد قبلی این خواهد بود:


Bart Homer Lisa Marge 

اگر می‌خواهیم ترتیب را معکوس کنیم، می‌توانیم sort() را با reverse() مبادله کنیم. از:


Collections.sort(simpsons);

به:


Collections.reverse(simpsons);

استقرار روش reverse() خروجی قبلی را به:

تغییر می‌دهد


Marge Lisa Homer Bart 

چگونه یک آرایه جاوا را مرتب کنیم

در جاوا، ما می‌توانیم آرایه‌ای را با هر نوع که می‌خواهیم مرتب کنیم تا زمانی که رابط Comparable را پیاده‌سازی کند. این یک مثال است:


public class ArraySorting {

    public static void main(String... moeTavern) {
        int[] moesPints = new int[] {9, 8, 7, 6, 1};

        Arrays.sort(moesPints);

        Arrays.stream(moesPints).forEach(System.out::print);

        Simpson[] simpsons = new Simpson[]{new Simpson("Lisa"), new Simpson("Homer")};

        Arrays.sort(simpsons);
        Arrays.stream(simpsons).forEach(System.out::println);
    }
}

در اولین فراخوان sort()، آرایه به ترتیب زیر طبقه بندی می شود:


۱ ۶ ۷ ۸ ۹

در دومین فراخوان sort()، به این صورت طبقه بندی می شود:


Homer Lisa

به‌خاطر داشته باشید که اشیاء سفارشی باید مقایسه‌پذیر را پیاده‌سازی کنند تا حتی به‌عنوان یک آرایه مرتب شوند.

نحوه اجتناب از ClassCastException هنگام مرتب سازی اشیاء جاوا

اگر شی سیمپسون مقایسه را پیاده سازی نمی کرد، یک ClassCastException پرتاب خواهد شد. اگر این را به صورت آزمایشی اجرا کنید، چیزی شبیه خروجی زیر خواهید دید:


Error:(16, 20) java: no suitable method found for sort(java.util.List<com.javaworld.javachallengers.sortingcomparable.Simpson>)
    method java.util.Collections.<T>sort(java.util.List<T>) is not applicable
      (inference variable T has incompatible bounds
        equality constraints: com.javaworld.javachallengers.sortingcomparable.Simpson
        lower bounds: java.lang.Comparable<? super T>)
    method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))

این گزارش ممکن است گیج کننده باشد، اما نگران نباشید. فقط به خاطر داشته باشید که یک ClassCastException برای هر شی مرتب شده ای که رابط مقایسه را اجرا نمی کند پرتاب می شود.

12 پسوند ggplot برای گرافیک snazzier R

مرتب‌سازی نقشه با TreeMap

Java API شامل کلاس‌های زیادی برای کمک به مرتب‌سازی است، از جمله TreeMap. در مثال زیر، ما از TreeMap برای مرتب کردن کلیدها در Map استفاده می‌کنیم.


public class TreeMapExample {

    public static void main(String... barney) {
        Map<SimpsonCharacter, String> simpsonsCharacters = new TreeMap<>();
        simpsonsCharacters.put(new SimpsonCharacter("Moe"), "shotgun");
        simpsonsCharacters.put(new SimpsonCharacter("Lenny"), "Carl");
        simpsonsCharacters.put(new SimpsonCharacter("Homer"), "television");
        simpsonsCharacters.put(new SimpsonCharacter("Barney"), "beer");

        System.out.println(simpsonsCharacters);
    }
}

TreeMap از روش compareTo() استفاده می کند که توسط رابط Comparable پیاده سازی شده است. هر عنصر در Map حاصل بر اساس کلید خود مرتب شده است. در این حالت، خروجی این خواهد بود:


Barney=beer, Homer=television, Lenny=Carl, Moe=shotgun

به یاد داشته باشید: اگر شیء مقایسه را پیاده سازی نکند، یک ClassCastException دریافت خواهید کرد.

مرتب‌سازی یک مجموعه با TreeSet

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


public class TreeSetExample {

    public static void main(String... barney) {
        Set<SimpsonCharacter> simpsonsCharacters = new TreeSet<>();
        simpsonsCharacters.add(new SimpsonCharacter("Moe"));
        simpsonsCharacters.add(new SimpsonCharacter("Lenny"));
        simpsonsCharacters.add(new SimpsonCharacter("Homer"));
        simpsonsCharacters.add(new SimpsonCharacter("Barney"));

        System.out.println(simpsonsCharacters);
    }
}

خروجی این کد این است:


Barney, Homer, Lenny, Moe

دوباره، اگر از شیئی استفاده کنیم که قابل مقایسه نیست، یک ClassCastException دریافت خواهیم کرد.

بعدی: استفاده از Comparable با کلاس‌های اصلی جاوا