كيفية الحصول على آخر 25 عنصر من مجموعة فرز؟

StackOverflow https://stackoverflow.com/questions/581677

  •  06-09-2019
  •  | 
  •  

سؤال

في Java، لدي مجموعة فرز قد تحتوي على 100000 عنصر. أود أن أحصل بكفاءة وأناقة على آخر 25 عنصرا. أنا في حيرة بعض الشيء.

للحصول على أول 25 كنت أتوقع وتوقف بعد 25 عنصرا. لكنني لا أعرف كيفية التكرار في ترتيب عكسي. أيه أفكار؟

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
هل كانت مفيدة؟

المحلول

تحتاج إلى أ NavigableSet. وبعد آخر سوف تضطر إلى القيام بذلك بشكل غير فعال، تكرار من خلال كله SortedSet وجمع العناصر في Queue أن تبقي قلصت عند 25 عنصرا.

نصائح أخرى

sortedset.<T> تم تصميمه على افتراض نموذج تكرار بسيط للغاية، إلى الأمام فقط، وبالتالي العثور على الإدخالات الأعلى غير سهلة ولكن العثور على الأخير سيتطلب قراءة مكلفة من خلال مكرر المحافظة الحفاظ على نافذة من إدخالات N الأخيرة.

navigableset.<T> إضافة في 1.6 يحل هذا (والتنفيذ الفرز الوحيد من 1.4 من البرامج تنفذ ذلك، لذلك من المحتمل أن تكون قطرة لاستبدال لك).

NavigableSet<T> set = new TreeSet<T>();
// add elements
set.descendingIterator() // iterate over the last n entires as needed

عكس فرزك وأخذ أول 25 عنصرا. يمكنك بعد ذلك عكس تلك التي ستكون فعالة مثل العناصر ال 25 الوحيدة.

بروس

سيكون بنية بيانات مختلفة أكثر ملاءمة لهذه العملية.

هذه ليست طريقة أنيقة أو فعالة للغاية, ، ولكن على افتراض أن الفرز في ترتيب تصاعدي يمكنك الحصول على آخر عنصر وإزالته، تخزينه في قائمة أخرى، وكرر 25 مرة. يجب عليك بعد ذلك وضع هذه العناصر مرة أخرى!

قد ترغب في إلقاء نظرة على indexedtreemap. في مفهرسة الشجرة خريطة

استخدم بالضبط (Size-25) للوصول إلى العنصر عند الفهرس بدون تكرار.

رمي المجموعة في قائمة واستخدام الأساس (). لست متأكدا من كيفية أداء إنشاء القائمة، لذلك يجب عليك تشغيل بعض الاختبارات. من المؤكد أنه يجعل الترميز سهل رغم ذلك.

    List f = new ArrayList( summaries);
    List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );

أنا أفترض أن هذا من غير المرجح أن يكون أي استخدام واقع حقيقي في مشروعك، ولكن تجدر الإشارة إلى أنه قد تكون بإمكانك ببساطة أن تكون قائمة مرتبة في الاتجاه المعاكس بدلا من ذلك :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top