فرز المصفوفات والمجموعات عمليًا
طبّق الفرز على قوائم المنتجات ولوحات المتصدرين وجداول الفعاليات باستخدام أمثلة واقعية
فرز المصفوفات والمجموعات عمليًا درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
الفرز عمليًا
يطبّق هذا الدرس تقنيات الفرز على سيناريوهات واقعية: كتالوجات المنتجات، ولوحات المتصدرين، وجدولة الفعاليات، وترتيب نتائج البحث.
Arrays.sort للمصفوفات البدائية
يستخدم Arrays.sort() للمصفوفات البدائية خوارزمية الفرز السريع ذات المحورين — وهي سريعة للغاية، بمتوسط O(n log n).
int[] scores = {45, 90, 78, 62, 88, 33};
Arrays.sort(scores);
System.out.println(Arrays.toString(scores)); // [33, 45, 62, 78, 88, 90]
// Sort a range only
int[] data = {9, 3, 7, 1, 5};
Arrays.sort(data, 1, 4); // sort indices 1-3 only
System.out.println(Arrays.toString(data)); // [9, 1, 3, 7, 5]Arrays.sort لمصفوفات الكائنات
بالنسبة إلى مصفوفات الكائنات، يستخدم Arrays.sort() خوارزمية TimSort المستقرة. ويمكنك توفير Comparator لترتيب مخصص.
String[] names = {"Charlie", "Alice", "Bob", "Diana"};
Arrays.sort(names);
System.out.println(Arrays.toString(names)); // [Alice, Bob, Charlie, Diana]
// Custom order: by length, then alphabetically
Arrays.sort(names, Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()));
System.out.println(Arrays.toString(names)); // [Bob, Alice, Diana, Charlie]Collections.sort وList.sort
تفرز الطريقتان List في مكانها. وتُعد List.sort() الطريقة الحديثة المفضلة.
List<Integer> nums = new ArrayList<>(List.of(5, 2, 8, 1, 9, 3));
// Old way
Collections.sort(nums);
System.out.println(nums); // [1, 2, 3, 5, 8, 9]
// Modern way (same result)
nums.sort(Comparator.naturalOrder());
nums.sort(null); // null means natural order
// Descending
nums.sort(Comparator.reverseOrder());
System.out.println(nums); // [9, 8, 5, 3, 2, 1]Stream.sorted() للنمط الوظيفي
استخدم stream().sorted() عند بناء مسار معالجة؛ إذ ينتج تدفقًا جديدًا مفروزًا دون تعديل المصدر.
List<String> cities = List.of("Tokyo", "London", "New York", "Paris", "Sydney");
// Sorted stream — source list unchanged
List<String> sorted = cities.stream()
.sorted(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()))
.collect(Collectors.toList());
System.out.println(sorted);
// [Paris, Tokyo, London, Sydney, New York]فرز Map حسب القيمة
سؤال شائع في مقابلات العمل: فرز Map حسب قيمها باستخدام stream وComparator.
import java.util.*;
import java.util.stream.*;
Map<String, Integer> scores = Map.of(
"Alice", 95, "Bob", 87, "Charlie", 92, "Diana", 87
);
Map<String, Integer> sorted = scores.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue(Comparator.reverseOrder())
.thenComparing(Map.Entry.comparingByKey()))
.collect(Collectors.toLinkedHashMap(
Map.Entry::getKey, Map.Entry::getValue,
(v1, v2) -> v1, LinkedHashMap::new));
sorted.forEach((k, v) -> System.out.println(k + ": " + v));
// Alice: 95 / Charlie: 92 / Bob: 87 / Diana: 87الفرز باستخدام Collator حسب الإعدادات المحلية
لفرز السلاسل النصية مع مراعاة اللغة، استخدم java.text.Collator بدلًا من String.compareTo؛ فهو يتعامل مع علامات التشكيل وحالة الأحرف وترتيب كل إعداد محلي.
import java.text.*;
import java.util.*;
List<String> names = new ArrayList<>(List.of("éclair", "apple", "Über", "banana"));
Collator collator = Collator.getInstance(Locale.GERMAN);
names.sort(collator);
System.out.println(names); // locale-aware sortفرز الكائنات وفق معايير متعددة
فرز منتجات التجارة الإلكترونية: المتوفر في المخزون أولًا، ثم حسب سعر البيع، ثم حسب التقييم، ثم حسب الاسم.
record Product(String name, double price, double salePrice, double rating, boolean inStock) {}
Comparator<Product> bestFirst = Comparator
.comparing(Product::inStock).reversed() // in-stock first
.thenComparingDouble(Product::salePrice) // cheapest sale price
.thenComparingDouble(Product::rating).reversed() // highest rated
.thenComparing(Product::name); // alphabetical tiebreakفرز الفعاليات حسب التاريخ والوقت
فرز جدول زمني للفعاليات ترتيبًا زمنيًا باستخدام أنواع java.time التي تطبّق Comparable.
import java.time.*;
import java.util.*;
record Event(String title, LocalDate date, LocalTime time) {}
List<Event> schedule = new ArrayList<>(List.of(
new Event("Workshop", LocalDate.of(2024,7,15), LocalTime.of(9, 0)),
new Event("Keynote", LocalDate.of(2024,7,14), LocalTime.of(10, 30)),
new Event("Lunch Talk",LocalDate.of(2024,7,15), LocalTime.of(12, 0)),
new Event("Hackathon", LocalDate.of(2024,7,14), LocalTime.of(9, 0))
));
schedule.sort(Comparator.comparing(Event::date).thenComparing(Event::time));
schedule.forEach(e -> System.out.println(e.date() + " " + e.time() + " " + e.title()));العناصر الأعلى N باستخدام الفرز
العثور على العناصر الأعلى N بكفاءة: افرز ترتيبًا تنازليًا وخذ أول N عنصرًا، أو استخدم PriorityQueue مع مجموعات البيانات الكبيرة.
List<Integer> values = List.of(42, 17, 88, 5, 73, 56, 91, 33);
// Simple approach: sort descending, take first 3
List<Integer> top3 = values.stream()
.sorted(Comparator.reverseOrder())
.limit(3)
.collect(Collectors.toList());
System.out.println(top3); // [91, 88, 73]
// For very large datasets: PriorityQueue min-heap approach is O(n log k)
import java.util.PriorityQueue;
PriorityQueue<Integer> heap = new PriorityQueue<>(3);
for (int v : values) {
heap.offer(v);
if (heap.size() > 3) heap.poll();
}
System.out.println(new TreeSet<>(heap).descendingSet()); // [73, 88, 91]إزالة التكرارات باستخدام الفرز
بعد الفرز، تصبح العناصر المكررة متجاورة، مما يتيح اكتشافها بتعقيد O(n).
int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5};
Arrays.sort(arr); // sort first
// Remove duplicates in O(n) after sorting
int[] unique = Arrays.stream(arr).distinct().toArray();
System.out.println(Arrays.toString(unique)); // [1, 2, 3, 4, 5, 6, 9]الأداء: اختيار طريقة الفرز
اختيار أسلوب الفرز المناسب:
- المصفوفات البدائية: Arrays.sort() — الأسرع، ويستخدم الفرز السريع في المكان
- مصفوفات أو قوائم الكائنات التي تستخدم Comparable: Collections.sort() أو List.sort(null)
- الترتيبات المتعددة: سلاسل Comparator باستخدام thenComparing
- العناصر الأعلى N من تدفق كبير: PriorityQueue أو Stream.sorted().limit(N)
اختبار سريع
ما خوارزمية الفرز التي تستخدمها Java لمصفوفات الكائنات في Arrays.sort()؟
خلاصة: فرز المصفوفات والمجموعات عمليًا
أهم النقاط:
- يستخدم Arrays.sort() للمصفوفات البدائية الفرز السريع ذا المحورين، بينما يستخدم TimSort المستقرة للكائنات
- تستخدم List.sort(comparator) وCollections.sort() خوارزمية TimSort المستقرة
- ينتج stream().sorted() تدفقًا جديدًا مفروزًا دون تعديل المصدر
- لفرز Map حسب القيمة: entrySet().stream().sorted(Map.Entry.comparingByValue())
- استخدم Collator لفرز السلاسل النصية مع مراعاة الإعدادات المحلية
- للعثور على العناصر الأعلى N من بيانات كبيرة: تكون PriorityQueue بسعة k أكثر كفاءة من الفرز الكامل
تعلم Java مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 104
- الدروس
- 374
الأسئلة الشائعة
هل درس «فرز المصفوفات والمجموعات عمليًا» مجاني؟
نعم — نص درس «فرز المصفوفات والمجموعات عمليًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «فرز المصفوفات والمجموعات عمليًا»؟
طبّق الفرز على قوائم المنتجات ولوحات المتصدرين وجداول الفعاليات باستخدام أمثلة واقعية تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «فرز المصفوفات والمجموعات عمليًا»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- واجهة Comparable
- الفرز باستخدام Comparator وLambda
- الفرز متعدد المفاتيح باستخدام thenComparing
- فرز المصفوفات والمجموعات عمليًا