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

Итак, я немного разбираюсь в функциональном программировании, но для этого я не могу использовать al oop и вместо этого должен использовать написанную мной функцию foldLeft или foldRight, чтобы получить minVal.

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

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;

Теперь мне нужно написать minVal:

//(5) Use minVal to calculate the minimum of a List of 
//       Integers
static <U> U minVal(Iterable<U> l, Comparator<U> c){
// write using fold.  No other loops permitted. 
List<U> temp = new ArrayList<U>();
l.forEach(temp::add);
return temp.stream().min(c).get(); //Not sure if this actually works yet
}

Я попытался написать и протестировать его, но теперь я застрял на том же, я бы протестировал minVal:

List<Integer> numList = new ArrayList<>();

    numList.add(5);
    numList.add(10);
    numList.add(15);
    numList.add(20);
    numList.add(22);
    numList.add(1);


    System.out.println(minVal(numList, 0)); //What would I place as the 
                                            //comparable argument 

Выше, конечно, дает мне ошибку. Я читал о Компараторах в Lambda, но не понимаю, как реализовать это в тесте (или в выражении print).

Любая помощь / объяснение приветствуется! PS Пожалуйста, дайте мне знать, если мне не хватает какой-либо информации, я старался быть максимально тщательным.

1 Ответ

3 голосов
/ 27 января 2020

Вы можете определить minVal, используя foldLeft как:

static <U> U minVal(Iterable<U> l, Comparator<U> c) {
    // write using fold.  No other loops permitted.
    return foldLeft(l.iterator().next(), l, (u, u2) -> c.compare(u, u2) < 0 ? u : u2);
    // check for l.iterator().hasNext() or else define the behaviour
}

, а затем вызвать его, используя Comparator<Integer, определенный как:

List<Integer> numList = List.of(5, 10, 15, 20, 22, 1);
System.out.println(minVal(numList, Integer::compare));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...