في حين أن فرز الكائنات في قائمة بناءً على حقل واحد يعد أمرًا بسيطًا، إلا أن الفرز باستخدام حقول متعددة قد يكون أمرًا صعبًا بعض الشيء . تتعمق هذه المقالة في مسألة الفرز حسب حقول متعددة وتستكشف الحلول المتنوعة المتوفرة في Java.
فكر في سيناريو حيث يكون لديك قائمة بكائنات "التقرير" بثلاثة حقول : مفتاح التقرير، رقم الطالب، والمدرسة. ترغب في فرز هذه القائمة باستخدام الحقول الثلاثة جميعها بترتيب معين.
يحاول مقتطف الكود الذي قدمته فرز القائمة باستخدام Collections.sort مع مقارنة مخصصة، ولكن لسبب ما، لا يعمل الفرز كما هو متوقع. أنت تشك في احتمال وجود مشكلة في الكود.
الرمز الخاص بك به مشكلة بالفعل. دعونا نحلل المشكلة ونحدد الحل الصحيح.
تكمن المشكلة في الكود المقدم في تسلسل الحقول الثلاثة:
return (record1.getReportKey() record1.getStudentNumber() record1.getSchool()).compareTo(record2.getReportKey() record2.getStudentNumber() record2.getSchool());
يفترض هذا التسلسل أن الحقول من اكتب سلسلة. ومع ذلك، في حالتك، يتم تعريف الحقول الثلاثة جميعها كأنواع سلسلة، وبالتالي فإن التسلسل سيؤدي ببساطة إلى مقارنة السلسلة. من المحتمل أن هذا لم يكن ما قصدته.
لمقارنة الحقول بشكل صحيح، تحتاج إلى مقارنتها بشكل فردي وبالترتيب الصحيح:
return Comparator.comparing(Report::getReportKey)
.thenComparing(Report::getStudentNumber)
.thenComparing(Report::getSchool)
.compare(record1, record2);
بالإضافة إلى الكود المصحح، إليك حلول بديلة للفرز حسب حقول متعددة في Java:
الخيار 1: الفرز الانعكاسي باستخدام BeanComparator
يمكن استخدام BeanComparator لفرز الكائنات بناءً على الحروف. ومع ذلك، فهي عرضة للأخطاء وأقل كفاءة بسبب استخدام الانعكاس.
الخيار 2: Google Guava ComparisonChain
يوفر Google Guava طريقة ملائمة لسلسلة مقارنات متعددة. كما أنه يتعامل مع القيم الفارغة بأمان.
الخيار 3: Apache Commons CompareToBuilder
تشبه فئة المكتبة هذه فئة ComparisonChain الخاصة بـ Guava ولكن لديها سلوك افتراضي مختلف قليلاً للقيم الخالية.
الحل الصحيح لمشكلتك هو استخدام الكود المنقح مع مقارنات الحقول الفردية. وبدلاً من ذلك، يمكنك اختيار أحد الخيارات الأخرى التي تمت مناقشتها أعلاه بناءً على متطلباتك المحددة. إن فهم مبادئ الفرز حسب الحقول المتعددة والاختلافات بين الأدوات المتاحة سيمكنك من التعامل بفعالية مع سيناريوهات الفرز المعقدة في تطبيقات Java الخاصة بك.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3