ما هو أفضل نهج لوجود نوع من مكرر كسول حيث يتم تقييم العائد فقط على الطلب؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

import java.util.Collection;

import example.Event;

public interface Query
{
    public boolean hasMore ();

    public Collection<Event> getNext ( long count ) throws Exception;
}

وهذه هي واجهة لدي، التي أريد تنفيذها.

ويفترض أن يكون مثل هذا التنفيذ:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import example.Event;
import example.Query;

public class ListQuery implements Query {

    public ListQuery(List<Event> events, String filter)
            throws FilterParseException {
        // events is the list of given events
        // filter is a string representation of the filter to apply
    }

    public Collection<Event> getNext(long count) throws Exception {
         // returns max. count next entries which match given filter
    }

    public boolean hasMore() {
        // returns if there are more elements matching the given filter
    }
}

وماذا أنا أفكر، هي العلاقة بين hasMore () وgetNext (). وفي كلتا الحالتين لا بد لي من تقييم ما إذا كان المرشح مباريات عنصر من القائمة. ربما أنا لا أعرف تنفيذ قائمة معينة، لذلك يمكن أن يكون عملية مكلفة. من الواضح أنني غير قادر على مجرد استخدام hasNext () من مكرر، لأن لدي لمعرفة ما اذا كان الحدث يطابق معايير معينة. في تنفيذ بلدي الحالي لدي اثنين من التكرارات المختلفة والوضع الحالي، حيث تم نقل واحد لhasMore () حتى إذا كان موقف مكرر لgetNext () أكبر من واحد لhasMore ().

وماذا أنا في الواقع أود القيام به، هو استنساخ مكرر الحالي وهو ما سيؤدي بدوره إلى استخدام لhasMore ()، ولكن لم يكن ذلك ممكنا بالطبع.

هل هناك حل أكثر أناقة لهذه المشكلة؟

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

المحلول

في تنفيذ getNext الخاص بك، بعد تعيين قيمة عودتك، هل يمكن أن تقدم مكرر حتى تجد حدثا مناسبا. بهذه الطريقة، يمكن hasMore الاختبار بسلام hasNext على مكرر لتحديد ما إذا كان للعودة true أو false.

نصائح أخرى

والتوقف عن تعذيب نفسك :-) ومجرد استخدام هذا:

<وأ href = "https://google.github.io/guava/releases/21.0/api/docs/com/google/common/collect/Iterables.html#filter-java.lang.Iterable-com. google.common.base.Predicate- "يختلط =" نوفولو noreferrer "> Iterables.filter (Iterable، المسند)

ويستغرق رعاية هذه المشاكل بالنسبة لك.

إذا لم يكن لديك البيانات الخاصة بك في أي شيء Iterable، فقط مكرر، راجع المكررات الدرجة المقابلة. إذا كنت بحاجة إلى تنفيذ مكرر نفسك، فإنه قد يساعد على توسيع AbstractIterator في تلك الحزمة نفسها.

وبعد ذلك إذا كنت تريد حقا أن تكون قادرة على استرداد قطع من النتائج التي يمكن استخدام أسلوب التقسيم () من ITERA * ليالي الطبقات.

وأنا أفكر حتى أنك لا تحتاج اثنين من التكرارات. الدعوة hasMore يمكن أعاد على طول الطريق حتى يجدها مباراة ومجرد البقاء هناك (إذا كان العنصر الذي يشير بالفعل إلى نتيجة، لا أعاد). الآن getNext سوف تستخدم نفس مكرر إلى تكرار وتجميع جمع عودة حتى يتم التوصل إلى أي عدد أو لا يتم العثور على العناصر الأكثر مطابقة.

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