سؤال

أنا أقرأ ملفات السجل ولكن لا تريد معالجة جميع الأسطر على الفور.أنا أستخدم قائمة انتظار/مخزن مؤقت لتخزين الخطوط أثناء انتظار معالجتها.

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

ولذلك فإن قائمة الانتظار تحتاج إلى ما يلي:

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

لقد كتبت الكود في البداية عندما كانت لدي خبرة قليلة في Java أو API، واستخدمت للتو ArrayList لأنني كنت أعلم أنها ستنجح (ليس بالضرورة لأنه كان الخيار الأفضل).

أصبح أدائها الآن ضعيفًا مع الحاجة إلى معالجة المزيد والمزيد من السجلات - لذا، ما هي المجموعة التي توصي باستخدامها في هذه الحالة؟هناك دائمًا إمكانية الكتابة بنفسي أيضًا.

شكرًا

هل كانت مفيدة؟

المحلول

قد يكون LinkedHashSet موضع اهتمام.إنها HashSet بشكل فعال ولكنها تحتفظ أيضًا بقائمة LinkedList للسماح بترتيب تكرار يمكن التنبؤ به - وبالتالي يمكن استخدامها أيضًا كقائمة انتظار FIFO، مع ميزة إضافية رائعة وهي أنها لا يمكن أن تحتوي على إدخالات مكررة.

نظرًا لأنها مجموعة HashSet أيضًا، يمكن أن تكون عمليات البحث (على عكس عمليات الفحص) O(1) إذا كان من الممكن مطابقتها equals()

نصائح أخرى

من المحتمل أن تكون القائمة المرتبطة هي الأكثر ملاءمة.يحتوي على جميع الخصائص المطلوبة، ويسمح بإزالة الروابط من المنتصف في وقت ثابت، بدلاً من الوقت الخطي المطلوب لقائمة ArrayList.

إذا كانت لديك استراتيجية محددة للعثور على العنصر التالي لإزالته، فقد تكون قائمة انتظار الأولوية أو حتى مجموعة مرتبة أكثر ملاءمة.

يتضمن الفحص السريع بشكل عام تنفيذًا يعتمد على التجزئة من نوع ما، وقد يكون ConcurrentSkipListMap تطبيقًا جيدًا.سجل (ن) على مفتاح الاحتواء، وأزل الطرق واحصل عليها، ويتم فرزه بحيث يمكنك الحصول على نوع من الأولوية المرتبطة به.

لا أريد فرز السطور التي تتم قراءتها (يجب الاحتفاظ بها بترتيبها الأصلي).ومع ذلك، من المحتمل أن أحظر الخطوط بناءً على معرف الجلسة الذي يحتوي عليه كل سطر مسجل (عدة خطوط مسجلة في كل جلسة).

بالتفكير في الأمر، من المحتمل أن أحصل على:

HashMap<String,LinkedList<String>>

وقم بتوفير معرف الجلسة كمفتاح، وقم بملء القائمة المرتبطة بالأسطر التي تنتمي إلى الجلسة.

ستوفر الخريطة طريقة سريعة للبحث عن الخطوط المتعلقة بالجلسة X، ومن ثم ستوفر القائمة المرتبطة أفضل أداء لإضافة / إزالة الخطوط (كان أداء البحث هو العثور على الخطوط المتعلقة بالجلسة X، وبالتالي الخطوط الفعلية يمكن قراءة ما يتعلق بالجلسة x وإزالتها من البداية إلى النهاية - دفع/إبراز).

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

نظرًا لأنك تحتاج إلى إزالة العناصر وإضافتها من المجموعة، والبحث عن قيم محددة، فربما تكون البنية الأفضل هي شيء يقوم بتنفيذ SortedSet، مثل TreeSet.تضمن هذه الفئة أداء السجل (n) للإضافة والإزالة والاحتواء.

أعتقد أن بعض المواضيع ستكتب في قائمة الانتظار وسيقرأ منها موضوع آخر.

في هذه الحالة عليك أن تنظر إلى قوائم الانتظار الموجودة في الحزمة java.lang.concurrent.

يمكنك استخدام PriorityBlockingQueue للسماح لها بترتيب العناصر لك، أو LinkedBlockingQueue إذا كنت تريد التكرار عليها واختيار العناصر التي تريد إزالتها بنفسك.

وأنا أتفق مع AVI والقائمة المرتبطة ستكون خيارك الأفضل.يمكنك تغيير الحجم بسهولة، والإضافة بسرعة إلى نهاية القائمة، والإزالة بسرعة من أي مكان.لن يكون البحث سريعًا، ولكنه ليس أسوأ من أي قائمة أخرى لم يتم فرزها.

الجوافة قد يساعد.

يحتوي مشروع Guava على العديد من مكتبات Google الأساسية التي نعتمد عليها في مشاريعنا المستندة إلى Java:المجموعات، والتخزين المؤقت، ودعم البدائيات، ومكتبات التزامن، والتعليقات التوضيحية الشائعة، ومعالجة السلسلة، والإدخال/الإخراج، وما إلى ذلك.

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