CodeGym /مدونة جافا /Random-AR /فرز مجموعات جافا ()
John Squirrels
مستوى
San Francisco

فرز مجموعات جافا ()

نشرت في المجموعة
إحدى الوظائف الأكثر شيوعًا التي نحتاجها كمطورين يتعاملون مع البيانات هي الفرز - من خلال قدرتنا على فرز بياناتنا، يمكننا تحسين خوارزمياتنا لتعمل بشكل أسرع بكثير، والعثور على البيانات التي تحتاجها في جزء صغير من الوقت الذي تستغرقه. سيستغرق الأمر خلاف ذلك. في درس اليوم، سنتحدث عن نوع مجموعات Java (). كتجربة فكرية سريعة: تخيل أنك تبحث عن اسم من خلال قائمة الجامعة. قد يكون هناك عشرات الآلاف من الطلاب في هذه المدرسة. إذا لم تكن القائمة التي تم تقديمها لك مرتبة أبجديًا، فستحتاج إلى تصفح كل صفحة على حدة والنظر بعناية شديدة للتأكد من أنك لم تتخطى أي اسم في أي مكان، حتى تجد الاسم الذي تبحث عنه أخيرًا. من ناحية أخرى، إذا كانت القائمة مرتبة أبجديًا، فلن يتعين عليك فقط أن تكون أقل صرامة في بحثك، ولكن يمكنك أيضًا الانتقال بسهولة إلى القسم الموجود في القائمة الذي يحتوي على نفس الحرف الأول، والاستمرار في التنقل بين الصفحات بقفزات كبيرة. حتى تهبط على الشخص الذي كنت تبحث عنه. كلما زاد عدد البيانات التي تتعامل معها، زادت أهمية استخدامها بأكبر قدر ممكن من الفعالية والكفاءة. في هذه المقالة، سنتعرف على كيفية فرز أي تطبيق للقائمة في Java (بما في ذلك ArrayList) باستخدام طريقة فرز المجموعات.

كيفية فرز قائمة ArrayList في Java باستخدام طريقة فرز مجموعات Java

دعونا نتحدث عن طريقة 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 من أنواع البيانات البدائية، فإن مجموعات Java تزودك بالفعل بمقارنة ReverseOrder(). يمكن أن يسمى مثل هذا:

Collections.sort(colors, Collections.reverseOrder());
الآن، تم ترتيب الألوان بشكل عكسي في مكانها بحيث إذا قمت بطباعتها، فستحصل على الإخراج التالي:

[Red, Orange, Green, Blue]

كيفية استخدام المجموعات لفرز أنواع البيانات غير البدائية في Java

لقد رأيت حتى الآن أن فرز ArrayLists للسلاسل أو ints في Java باستخدام طريقة Collections.sort() يعد أمرًا سهلاً مثل سطر واحد من التعليمات البرمجية. لكن في كثير من الأحيان، ستقوم ArrayLists بتخزين أنواع بيانات غير بدائية. عندما تعمل مع بيانات ذات سمات أكثر تعقيدًا، ستحتاج إلى كتابة فئات لتمثيل هذه الكائنات وكيفية مقارنتها ببعضها البعض باستخدام سماتها. لاستكشاف مثال على ذلك، دعونا نعيد النظر في مثال فرز قائمة الألوان، ولكن هذه المرة، بدلاً من فرز السلاسل، سنقوم بفرز كائنات الألوان. قد تبدو فئة الألوان الأساسية لدينا كما يلي:

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;
	}
}
من أجل جعل فئة اللون الخاصة بنا متوافقة مع Collections.sort()، حتى تتمكن المجموعات من فهم كيفية مقارنة كائنات الألوان وفرزها، نحتاج إلى إجراء تعديلين صغيرين:
  1. جعل اللون كائنًا قابلاً للمقارنة (إضافة أدوات قابلة للمقارنة<Object>)
  2. تجاوز طريقة CompareTo في الفصل (تجاوز public 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);
	}
}
لاحظ أن طريقة مقارنة اللون تستدعي ببساطة طريقة مقارنة السلسلة؛ سيتم الفرز حسب الترتيب الأبجدي. إذا أردنا الفرز حسب القيمة الحمراء بترتيب تصاعدي، على سبيل المثال، يمكننا استبدال عبارة الإرجاع بإرجاع this.r - cr؛ (إذا أردنا الفرز حسب القيمة الخضراء بترتيب تنازلي، فسيكون ذلك return cg - this.g;). الآن، إذا اتصلنا

Collections.sort(colors);
في قائمة ArrayList من الألوان بدلاً من السلاسل فقط، قد ينجح الأمر لأن المجموعات تفهم كيفية مقارنة كائنات الألوان. إذا كنت لا تريد أن تجعل الكائن الخاص بك يطبق Comparable<Object>، فيمكنك بدلاً من ذلك كتابة مقارن لفئتك، وتمرير ذلك إلى الأسلوب 2-parameter Collections.sort() . تقوم المقارنة بتجاوز الطريقة العامة int Compar(Object one، Object two)، وتستخدم الطريقة 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، وستظل تعمل. في بعض الأحيان، ستلاحظ أن هذا يتم تنفيذه مباشرةً باستخدام وظائف lambda. دالة لامدا هي في الأساس دالة بدون اسم يمكنك تعريفها ضمن سطر التعليمات البرمجية الذي يستدعيها. تكون مفيدة عندما تحتاج فقط إلى استدعاء دالة لمثيل واحد محدد ولا تريد تعريف دالة منفصلة بالكامل في مكان آخر. يمكن تعريف المقارنة SortByName مباشرة، باستخدام دالة lambda، مثل هذا:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
كما كنت قد خمنت، تمثل (a، b) معلمات وظائف lambda (الكائنان المراد مقارنتهما). يشير -> إلى أن ما يلي هو تعريف دالة لامدا. هذا كل ما في الأمر! لقد شاهدت الآن الطرق الأكثر شيوعًا لفرز ArrayLists في Java باستخدام حزمة Collections.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION