آیا به دنبال مرتبسازی اشیاء جاوا در یک مجموعه، آرایه یا نقشه هستید؟ یاد بگیرید که چگونه از رابط های Comparable و Comparator استفاده کنید و از ClassCastException اجتناب کنید.
برنامه نویسان اغلب نیاز دارند عناصر را از پایگاه داده به مجموعه، آرایه یا نقشه مرتب کنند. در جاوا، میتوانیم هر الگوریتم مرتبسازی را با هر نوع که بخواهیم پیادهسازی کنیم.
با استفاده از رابط Comparable
و روش compareTo()
، میتوانیم با استفاده از ترتیب حروف الفبا، طول String
، ترتیب حروف الفبا معکوس یا اعداد مرتب کنیم. . رابط Comparator
به ما امکان می دهد همین کار را انجام دهیم اما به روشی انعطاف پذیرتر.
هر کاری که میخواهیم انجام دهیم، فقط باید بدانیم که چگونه منطق مرتبسازی صحیح را برای رابط و نوع دادهشده پیادهسازی کنیم.
مرتبسازی با رابطهای Comparable و Comparator جاوا
در اینجا چیزی است که در این مقاله درباره مرتب سازی اشیاء جاوا خواهید آموخت:
- مرتبسازی با
مقایسه
:- مرتب سازی
لیست
- نحوه عملکرد
compareTo()
جاوا - نحوه مرتب سازی آرایه ها در جاوا
- مرتب سازی
نقشه
جاوا باTreeMap
- مرتب سازی
Set
جاوا باTreeSet
- نحوه اجتناب از
ClassCastException
هنگام مرتبسازی - استفاده از
مقایسه
با کلاسهای اصلی جاوا
جاوا
- مرتب سازی
- مرتب سازی
لیست
- نحوه عملکرد
compareTo()
جاوا - نحوه مرتب سازی آرایه ها در جاوا
- مرتب سازی
نقشه
جاوا باTreeMap
- مرتب سازی
Set
جاوا باTreeSet
- نحوه اجتناب از
ClassCastException
هنگام مرتبسازی - استفاده از
مقایسه
با کلاسهای اصلی جاوا
جاوا
- مرتب سازی با
مقایسه کننده
:- استفاده از
مقایسه کننده
با کلاس های داخلی ناشناس - استفاده از
مقایسه کننده
با عبارات لامبدا
- استفاده از
- استفاده از
مقایسه کننده
با کلاس های داخلی ناشناس - استفاده از
مقایسه کننده
با عبارات لامبدا
مرتب سازی با 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
ما فقط می توانیم از کلاس هایی استفاده کنیم که با متد sort()
قابل مقایسه باشند. اگر سعی کنیم Simpson
را ارسال کنیم که مقایسه
را اجرا نمی کند، یک خطای کامپایل دریافت خواهیم کرد.
روش 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
برای هر شی مرتب شده ای که رابط مقایسه
را اجرا نمی کند پرتاب می شود.
مرتبسازی نقشه با 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 و Comparator
مرتب سازی اشیاء جاوا با Comparable و Comparator
مرتب سازی اشیاء جاوا با Comparable و Comparator