static void merge(int []part1,int []part2,int []array)
{
int index1=0;
int index2=0;
for(int k=0; k<array.length; k++)
{
if(index1==part1.length)
{
array[k]=part2[index2];
index2++;
System.out.println("fourth");
}
else if(index2==part2.length)
{
array[k]=part1[index1];
index1++;
System.out.println("third");
}
else if(part1[index1]<part2[index2])
{
array[k]=part1[index1];
index1++;
System.out.println("second");
}
else
{
array[k]=part2[index2];
index2++;
System.out.println("first");
}
}
}
part1
和part2
长度为4,数组长度为8.在这种情况下,为什么“第二个”是第一个打印而不是“第一个”?
条件全是false
,这就是else
是第一个打印的原因吗?
我对else if
感到困惑。
答案 0 :(得分:1)
在if(condition)else if(condition2)else ...中,没有第一个/第二个被执行。这也不是特定于java的。仅执行条件为真的块。在这里你首先得到:
如果(index1之间== part1.length)
=&GT; index1 = 0
=&GT; part1.length = 4
所以这个条件是假的。
否则if(index2 == part2.length)
我们在这里有完全相同的情况,条件是假的
否则if(part1 [index1]&lt; part2 [index2])
除非我们知道输入数组中的内容,否则我们无法知道它是否为false,但根据您的注释,此条件为真,因此此块中的代码与System.out.println一起执行( “第二”);
想想这段代码试图实现的目标(我们将2个排序的数组合并到第3个也将被排序的数组中),理解它在循环内,并且对于每个循环迭代,它执行的是不同的阻止取决于条件。
答案 1 :(得分:0)
您在第三个条件下打印第二个,即在第一次for
次迭代时,当数组中包含任何元素并且part1[0] < part2[0]
答案 2 :(得分:0)
当您链接if else
条件为真的第一个块时,运行,而不是其他。
if(a) {
x();
} else if(b) {
y();
} else if(c) {
z();
}
可能有助于认识到上述内容相当于:
if(a) {
x();
} else {
if(b) {
y();
} else {
if(c) {
z();
}
}
}
这就是编译器如何解释它;然而,大多数人类读者发现第一个版本,支持更少,缩进更少,更容易阅读。
在您的代码中,如果&#34; second&#34;印刷后,我们可以确定第三个条件是真的。
第三个条件是:
part1[index1]<part2[index2]
第一次循环时,index1和index2都为零,因此当part1
的第一个元素小于part2
的第一个元素时,此块会运行。
您可以通过在&#34; second&#34;:
之上添加另一个调试println来确认这一点 System.out.println( "part1[" + index1 + "]=" + part1[index1]);
System.out.println( "part2[" + index2 + "]=" + part2[index2]);
System.out.println("second");
但请注意,使用println进行调试是一个不好的习惯 - 尽可能快地学习使用调试器。