Java 方法返回";可选[0]”;整数的瞬间

Java 方法返回";可选[0]”;整数的瞬间,java,interpolation,optional,Java,Interpolation,Optional,你好,一个相当简单的问题:我应该编写一个方法split(int[]array,int-toSearch,int-lower,int-upper),它使用插值方法来找出拆分数组的位置。它应该返回要拆分的索引x。我的代码如下所示: private static int split(int[] array, int toSearch, int lower, int upper){ int x = 0; int v = toSearch; int l = lower; i

你好,一个相当简单的问题:我应该编写一个方法split(int[]array,int-toSearch,int-lower,int-upper),它使用插值方法来找出拆分数组的位置。它应该返回要拆分的索引x。我的代码如下所示:

private static int split(int[] array, int toSearch, int lower, int upper){
    int x = 0;
    int v = toSearch;
    int l = lower;
    int r = upper;
    x = l + (v-array[l])/(array[r]-array[l])*(r-l);
    return x;
}
private static int search(int[] array, int toSearch){
    int Stelle = 0;
    if(array.length > 0){
        int v = toSearch;
        int l = 0;
        int r = array.length - 1;
        int i = 0;
        Stelle = split(array, v, l, r);
        while(array[Stelle] != v){
            Stelle = split(array, v, l, r);
            l = Stelle + 1;
            i++;
            if(i>1000){
                break;
            }
        }
    }
    if(array.length == 0){
        Stelle = -1;
    }
return Stelle;
}
public static void main(String[] args){
    int v = Integer.parseInt(args[0]);
    int[] array = new int[args.length -1];
    for(int i = 0; i<array.length; i++){
        array[i] = Integer.parseInt(args[i+1]);
    }
    System.out.println(search(array, v));
}

我的问题的解决方法是我定义x的方式。对于足够大的值,我将使用x=0,因为x是int,因为(v-array[l])/(array[r]-array[l])的结果通常小于1,我的方法将其解释为0。所以我所要做的就是在部门前面写上(r-l),然后它就成功了。我想我的程序之所以能正常运行,是因为纯粹的运气。lol:D

你没有向我们展示测试代码。欢迎来到StackOverflow!我无法从你的问题中看出你的测试代码是什么样子的?为了让我们提供帮助,请包括再现错误所需的完整代码。我现在包括测试代码什么类型的
程序
?什么类型的分割法?我仍然认为您没有向我们展示足够的代码来解决这个问题。您仍然没有提供返回选项的代码,即
程序。execute
方法。但是测试的要点似乎是断言
split(SEARCH\u ARRAY,7,0,8)
返回1,测试失败,因为它返回0。看起来你想写一个二进制搜索,对吗?
 void testSplit() {
private static final int[] SEARCH_ARRAY = new int[]{2, 4, 7, 9, 12, 21, 26, 31, 37};
            var result1 = Program.execute(() -> SPLIT_METHOD.invoke(null, SEARCH_ARRAY, 7, 0, 8));
            var result2 = Program.execute(() -> SPLIT_METHOD.invoke(null, SEARCH_ARRAY, 21, 4, 8));
            var result3 = Program.execute(() -> SPLIT_METHOD.invoke(null, SEARCH_ARRAY, 21, 0, 8));
    
            assertThat(result1.getReturnValue()).contains(1);
            assertThat(result2.getReturnValue()).contains(5);
            assertThat(result3.getReturnValue()).contains(4);
        }