Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何在没有循环且仅使用foldLeft的情况下获得minPos?_Java_Oop_Functional Programming_Fold - Fatal编程技术网

Java 我如何在没有循环且仅使用foldLeft的情况下获得minPos?

Java 我如何在没有循环且仅使用foldLeft的情况下获得minPos?,java,oop,functional-programming,fold,Java,Oop,Functional Programming,Fold,我一直在琢磨如何解决这个问题。目标是找到一个无环的可数(l)的最小值的位置。这里有一个类似的问题: 但这可以简单地使用lambda。在这种情况下,我需要将实现双函数的类作为第三个参数传递给foldLeft或foldRight调用。你将如何解决这个问题?我开始创建一个实现了双函数的新类,但对于如何确定最小值在l中的位置,我感到困惑 static <U,V> V foldLeft(V e, Iterable<U>l, BiFunction<V,U,V> f){

我一直在琢磨如何解决这个问题。目标是找到一个无环的可数(l)的最小值的位置。这里有一个类似的问题: 但这可以简单地使用lambda。在这种情况下,我需要将实现双函数的类作为第三个参数传递给foldLeft或foldRight调用。你将如何解决这个问题?我开始创建一个实现了双函数的新类,但对于如何确定最小值在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;
}
static V foldLeft(ve、Iterablel、双功能f){
//双函数接受U和V并返回V
V-ret=e;
对于(U i:l){
ret=f.apply(ret,i);
}
返回ret;
}
静态V折叠灯(VE、Iterablel、双功能f){
对于(U:l){
e=f。应用(u,e);
}
返回e
}
静态int minPos(Iterable l){
//使用折叠写入。不允许使用其他循环。
int值=0;
返回值;
}
更新:我已经弄明白了

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;
}
类FindMinPos实现了双功能{
公共图书馆;
public ArrayList a=新的ArrayList();
公共int minPos;
公共金融机构(ITEL){
这个。l=l;
对于(U i:l){
a、 加(i);
}
}
@凌驾
公共U应用(U U,U u2){

U minVal=U!=null&&U.compareTo(u2)如果将
minPos()
的返回类型修改为与参数一致,则可以使用如下lambda表达式:

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);
}
static U minPos(Iterable coll){

返回foldLeft((U)null,coll,(a,b)->a!=null&&a.compareTo(b)您不相信lambda可以实现
BiFunction
?我知道它可以是lambda。只是不确定是否可以通过将lambda作为第三个参数传递给minPos来获得此方法所需的功能?您无法实现
minPos
,因为将返回什么
int
值de>列出
设置
为最小值?很遗憾,我们无法更改此分配的签名,因此我无法按自己的意愿进行更改。@laraveldev17那么,如果
U
可以是任何值,如何从
U
中获取
int
值?