سؤال

انا املك SortedSet (على وجه التحديد أ TreeSet) تحتوي على تحديثات. التحديث هو شيء يشبه الالتزام SVN ، و post Facebook Wall ، وتذكرة TRAC جديدة ، وما إلى ذلك. أقوم بتخزينها في SortedSet لان:

  • مرتبة: يجب فرز التحديثات حسب التاريخ ، ونزول.
  • المجموعة: عند إحضار آخر التحديثات من مصدر تحديث ، سأتلقى عادة تحديثات موجودة بالفعل في المجموعة.

الآن ، بعد فترة من الوقت ستنمو المجموعة ضخمة حقًا ، لذلك أود إزالة أي شيء سوى العناصر X الأولى من المجموعة (لأن الآخرين لن يتم عرضهم على أي حال). كيف يمكنني القيام بذلك ، لأنه ليس List?

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

المحلول

While(mySet.size() > limit) {
  mySet.remove(mySet.last());
}

نصائح أخرى

يجب أن يعتمد الحل هنا على حقيقة ما إذا كنت بحاجة إلى البيانات "الإضافية" في المستقبل. إذا كنت بحاجة إلى الحل الخاص بك بناءً على قائمة إضافية على ما يرام. إذا لم يكن كذلك ، أقترح ما يلي:

قم بإنشاء مجموعة مصنفة خاصة بك والتي تمد java.util.sortedset وتتجاوز طريقة add (). يجب ألا تفعل هذه الطريقة شيئًا بعد حد معين. بدلاً من ذلك ، يمكنك إنشاء مجموعة "Wrapper" التي تحتوي على مجموعة الحمولة النافعة ويفوض جميع الطرق باستثناء ADD (). يجب أن تقوم طريقة ADD () بتفويض مكالمتها فقط إذا كان حجم مجموعة الحمولة النافعة أقل من الحد المحدد مسبقًا. هذه هي الطريقة ثابتة من Jakarta Collection Framework Works ، بحيث يمكنك فقط استخدامه.

الجواب المقبول في غير فعال حقًا س (ln n) لأنه يستخدم إزالة الوظيفة. هنا أفضل منذ ذلك الحين pollLast() هو س (1) والحجم س (1). سوف يتأثر التعقيد فقط من الحجم المقطوع.

While(mySet.size() > limit) {
  mySet.pollLast();
}

الحل الخاص بي هو:

        List<Update> trimmed = new ArrayList<Update>(20);
        int i = 0;
        for (Update u : updates) {
            trimmed.add(u);
            i++;
            if (i > 20) break;
        }
        updates = new TreeSet<Update>(trimmed);

فيما يلي طريقة حل عمل لجافا ، مع ذلك النتائج, ومتغير بحجم تحديد حجم المجموعة الناتجة:

void setLimit(Set<T> resutls, int size) {
    List<T> items = new ArrayList<T>();
    items.addAll(resutls);
    resutls.clear();
    int trim = size>items.size() ? items.size() : size;
    resutls.addAll(items.subList(0,trim));
    // return results; // optionally, if required
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top