JavaRush /مدونة جافا /Random-AR /كيفية القيام بالفرز بشكل صحيح في جافا
eGarmin
مستوى

كيفية القيام بالفرز بشكل صحيح في جافا

نشرت في المجموعة
من خلال تحليل الكود المصدري للعديد من مشاريع Java مفتوحة المصدر، وجدت أن معظم المطورين ينفذون الفرز بطريقتين مختلفتين فقط. يعتمد أحدهما على استخدام طريقة sort()الفصل Collectionsأو Arrays، والآخر يعتمد على استخدام هياكل البيانات ذاتية الفرز مثل TreeMapو TreeSet. كيفية القيام بالفرز بشكل صحيح في جافا - 1

باستخدام طريقة الفرز ().

إذا كنت بحاجة إلى فرز مجموعة، فاستخدم الملف Collections.sort().
// Collections.sort(…)
List<ObjectName> list = new ArrayList<ObjectName>();
Collections.sort(list, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
إذا كنت بحاجة إلى فرز مصفوفة، استخدم Arrays.sort().
// Arrays.sort(…)
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
تكون هذه الطريقة sort()ملائمة جدًا عندما تكون المجموعة أو المصفوفة مليئة بالقيم بالفعل.

استخدام هياكل البيانات ذاتية الفرز

إذا كنت بحاجة إلى فرز قائمة ( List) أو تعيين ( Set)، فاستخدم TreeSetبنية الفرز.
// TreeSet
Set<ObjectName> sortedSet = new TreeSet<ObjectName>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedSet.addAll(unsortedSet);
إذا كنت بحاجة إلى فرز قاموس ( Map)، فاستخدم TreeMapبنية الفرز. TreeMapمرتبة حسب المفتاح ( key).
// TreeMap – использующий String ключи и компаратор (Comparator) CASE_INSENSITIVE_ORDER,
// упорядочивающий строки (String) методом compareToIgnoreCase
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);
//TreeMap – общий случай, компаратор указывается вручную
Map<ObjectName, String> sortedMap = new TreeMap<ObjectName, String>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedMap.putAll(unsortedMap);
الطريقة المذكورة أعلاه مفيدة جدًا في الحالات التي تحتاج فيها إلى إجراء عدد كبير من عمليات البحث عن العناصر الموجودة في المجموعة. تتمتع هياكل البيانات ذاتية الفرز بكفاءة O(log(n))أفضل من O(n). وهذا يعني أنه عندما تتضاعف كمية البيانات الموجودة في المجموعة، فإن وقت البحث لا يتضاعف، بل يزداد بمقدار ثابت .

نهج سيء لمشكلة الفرز

لا يزال بإمكانك العثور على أمثلة حيث يصف المبرمجون بشكل مستقل خوارزميات الفرز. ضع في اعتبارك رمز الفرز الموضح أدناه (فرز مصفوفة مزدوجة بترتيب تصاعدي ). هذا الرمز ليس غير فعال فحسب، بل غير قابل للقراءة أيضًا. وهناك العديد من هذه الأمثلة.
double t;
for (int i = 0; i < N; i++)
	for (int j = i + 1; j < N; j++)
		if (r[j] < r[i]) {
			t = r[i];
			r[i] = r[j];
			r[j] = t;
		}
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION