سؤال

وأنا غالبا ما تحتاج إلى تشغيل الحد (وتسمى أيضا foldl / foldr، وهذا يتوقف على الظروف الخاصة بك) في جافا لتجميع عناصر Itterable.

وتقليل يأخذ مجموعة / iterable / الخ، وهي وظيفة من معلمتين، وقيمة بداية اختيارية (اعتمادا على تفاصيل التنفيذ). يتم تطبيق وظيفة تباعا إلى عنصر جمع وإخراج الطلب السابق من الحد حتى يتم معالجة جميع العناصر، وإرجاع القيمة النهائية.

هل هناك تنفيذ من نوع الآمن للتقليل في أي API جافا مشترك؟ مجموعات جوجل <م> يبدو مثل ذلك ينبغي أن يكون واحد، ولكن لم أكن قادرا للعثور عليه. (ربما لأنني لا أعرف ما أسماء البعض انها ستستخدم).

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

المحلول

وربما يمكن لفة بنفسك عام بسهولة جدا، على أساس وصفك:

public interface Reducer<A, T>
{
    public A foldIn(A accum, T next);
}

وبعد ذلك باستخدام نموذج الإستراتيجية:

public class Reductor<A, T>
{
    private Reducer<A, T> worker;
    public Reductor<A, T>(Reducer<A, T> worker)
    {
        this.worker = worker;
    }

    public A fold(A rval, Iterator<T> itr)
    {
        while(itr.hasNext())
        {
            A rval = worker.foldIn(rval, itr.next());
        }
        return rval;
    }
}

وأنا متأكد من أن هناك من نصف طن من أخطاء في بناء الجملة ولكن هذا هو النقطة الرئيسية (هناك عدد قليل من الخيارات التي يمكن أن تجعل حول كيفية الحصول على قيمة تراكم فارغة. ثم استخدامه على مكرر معين فقط تحديد المخفض الخاص بك على تطير:

Reductor r = new Reductor<A, T>(new Reducer<A, T>()
{
    public A foldIn(A prev, T next)
    {
        A rval;
       //do stuff...
       return rval;
     }
 }

 A fold = r.fold(new A(), collection.getIterator());

وهذا يتوقف على الكيفية التي يعمل مكرر الخاصة بك وهذا يمكن أن أضعاف أضعاف اليسار أو اليمين ما دام يذهب مكرر في الاتجاه الصحيح.

وأمل أن يساعد هذا.

نصائح أخرى

وبناء على اقتراح لوقا، وهنا هو تطبيق جافا شرعي:

public interface Reducer<A,T>
{
    A foldIn(A accum, T next);
}

public static <T> T reduce(final Reducer<T,T> reducer, 
        final Iterable<? extends T> i)
{
    T result = null;
    final Iterator<? extends T> iter = i.iterator();
    if (iter.hasNext())
    {
        result = iter.next();
        while (iter.hasNext())
        {
            result = reducer.foldIn(result, iter.next());
        }
    }
    return result;
}

public static <A,T> A reduce(final Reducer<A,T> reducer, 
        final Iterable<? extends T> i, 
        final A initializer)
{
    A result = initializer;
    final Iterator<? extends T> iter = i.iterator();
    while (iter.hasNext())
    {
        result = reducer.foldIn(result, iter.next());
    }
    return result;
}

حزمة functor . لقد كان في رمل إلى الأبد، لكنني أعتقد أنها سوف تفعل ما تريد.

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