Как бы я получил minPos без al oop и используя только foldLeft? - PullRequest
0 голосов
/ 30 января 2020

Я застрял, пытаясь понять, как я могу решить эту проблему. Цель состоит в том, чтобы найти позицию минимального значения Iterable (l) без циклов. Здесь есть похожая проблема: Как бы я получил minVal без al oop и используя только foldLeft? Но для этого можно просто использовать лямбду. В этом случае мне нужно передать класс, который реализует BiFunction, в качестве третьего аргумента для вызова foldLeft или foldRight. Как бы вы решили это? Я начал создавать новый класс, в котором реализована функция BiFunction, но заблудился относительно того, как определить позицию минимального значения в l.

static <U,V> V foldLeft(V e, Iterable<U>l, BiFunction<V,U,V> f){
    //BiFunction takes a U and V and returns a V
    V ret = e;

    for(U i : l) {
        ret = f.apply(ret, i);
    }

    return ret;
}

static <U,V> V foldRight(V e, Iterable<U>l, BiFunction<U,V,V> f){
   for(U u:l) {
      e = f.apply(u, e);
   }
return e
}

static <U extends Comparable<U>> int minPos(Iterable<U> l){
    // write using fold.  No other loops permitted.
    int value = 0;


    return value;
}

ОБНОВЛЕНИЕ: Я понял это

class FindMinPos<U extends Comparable<U>> implements BiFunction<U, U, U> {

    public Iterable<U> l;
    public ArrayList<U> a = new ArrayList<U>();
    public int minPos;

    public FindMinPos(Iterable<U> l) {
        this.l = l;
        for(U i : l) {
            a.add(i);
        }
    }

    @Override
    public U apply(U u, U u2) {
        U minVal = u != null && u.compareTo(u2) <= 0 ? u : u2;
        minPos = a.indexOf(minVal);

        return minVal;
    }
}

static <U extends Comparable<U>> int minPos(Iterable<U> l){
    // write using fold.  No other loops permitted.
    int minPos = 0;

    FindMinPos<U> f = new FindMinPos<U>(l);
    U minValue = foldLeft(l.iterator().next(), l, f);
    minPos = f.minPos;

    return minPos;
}

1 Ответ

0 голосов
/ 30 января 2020

Если вы исправите тип возвращаемого значения minPos(), чтобы он соответствовал параметру, то вы бы сделали это с помощью лямбда-выражения, подобного этому:

static <U extends Comparable<U>> U minPos(Iterable<U> coll) {
    return foldLeft((U) null, coll, (a, b) -> a != null && a.compareTo(b) <= 0 ? a : b);
}
...