好的,听我说完.这是我的插入排序代码.

        for (int i = 0; i < arr.length; i++) {
            T curr = arr[i];
            int i2 = i - 1;
            // if (i2 == -1) {
            //     System.out.println("yes");
            //     break;
            // } 
            while (i2 >= 0 && comparator.compare(arr[i2], curr) > 0) {
                arr[i2 + 1] = arr[i2];
                i2--;
            }
            arr[i2 + 1] = curr;
        }

所以,到目前为止,我

if (i2 == -1) {
    sout("yes");
    break;
}

因为我想跳过迭代,其中i2显然等于-1,因此对数组没有任何影响,因为第一次迭代什么都不做,并且将第一个元素保持在数组的0位置,因为插入排序正是这样工作的.

现在,我不太确定到底发生了什么,因为正如前面提到的if语句被注释掉一样,该算法完全按照预期工作.BUT,当我取消注释时,算法失败.

我不明白的是,注释掉它,或者根本不包括这个if语句,是如何导致算法失败的,因为不管怎样,当i2==-1时,就我所知,实际上对算法没有影响,因为,当i2为-1,并且省略了所描述的if语句时,while循环不会执行,而arr[i2+1]=curr语句会执行,但它只会保持第一个元素在其位置上,而if语句的存在正是如何保持第一个元素在其位置上的,因为它打破了循环,并且不会改变任何东西.

我不确定我是否完全疯了,是否遗漏了一个理智的人无法解释的清晰信息,但我确实看不到省略或包含所描述的if语句会改变代码的任何方面,特别是因为在for循环的第一次迭代中i2只会是-1.

非常感谢你.

推荐答案

你应该把break换成continue.

因为,在第一次迭代时,它总是-1,它将打破for循环,这意味着没有进一步的迭代.

continue是正确的武器.

if (i2 == -1) {
    sout("yes");
    continue;
}

上面的代码将跳过第一次迭代,而您的代码将终止for循环.

但是,不需要这个if块,因为您已经在while循环的条件下过滤掉了第一次迭代.

Java相关问答推荐

当耗时的代码完成时,Circular ProgressIndicator显示得太晚

SQlite for Android无法使用json_group_array/json_object

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

基本时态运算的ISO-8601周数据表示法

Jlink选项&-strie-ative-Commands";的作用是什么?

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

测试何时使用Mockito强制转换对象会导致ClassCastException

如何将其他属性引用到log4j2 yaml配置中?

如果按钮符合某些期望,如何修改它的文本?

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

Regex以查找不包含捕获组的行

Cordova Android Gradle内部版本组件不兼容

无法将GSON导入到我的JavaFX Maven项目

没有Tomcat,IntelliJ如何在本地运行API?

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

如何在Spring Security中设置一个任何人都可以打开的主页?

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持

Java返回生成器的实现

Java编译器是否进行了持续的折叠优化,以及如何进行判断?