java 中 if else 语句的逻辑错误
Logical Error in if else statement in java
我的代码:
import org.ujmp.core.Matrix;
import org.ujmp.core.SparseMatrix;
public class part {
public static void main(String args[]) throws Exception{
Matrix Bigomega=Matrix.Factory.zeros(6,6);
Matrix omega = SparseMatrix.Factory.zeros(6, 6);
int []timea={1,2,3,4,5,6};
int [] timeb={3};
int k1=0,k2=0;
while (k1 < timea.length && k2 < timeb.length ) {
if (timea[k1] < timeb[k2]) {
omega.setAsInt(1, k1, k1);
omega.setAsInt(-1, k1, k1 + 1);
omega.setAsInt(-1, k1 + 1, k1);
omega.setAsInt(1, k1 + 1, k1 + 1);
Bigomega = Bigomega.plus(omega);
omega.clear();
k1++;
}
else if (timea[k1] == timeb[k2]){
omega.setAsInt(1, k1, k1);
omega.setAsInt(-1, k1, k1 + 1);
omega.setAsInt(-1,k1+1,k1);
omega.setAsInt(1,k1+1,k1+1);
Bigomega=Bigomega.plus(omega);
omega.clear();
k2++;
}
}
System.out.println(Bigomega);
}
}
输出:
1.0000 -1.0000 0.0000 0.0000 0.0000 0.0000
-1.0000 2.0000 -1.0000 0.0000 0.0000 0.0000
0.0000 -1.0000 2.0000 -1.0000 0.0000 0.0000
0.0000 0.0000 -1.0000 1.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
不需要的输出。得到timea[k1] == timeb[k2]
后,循环在这里终止。但我希望在从 timea 和 timeb 获得相似元素后,循环继续,直到访问 timea 的所有元素。根据我的代码,它从 timea 数组访问 1,2,3,然后丢弃。这是非常明显的,因为 while 语句 while (k1 < timea.length && k2 < timeb.length )
。因为当它得到循环计数器时 k2++
k2 递增 1。所以在从 timeb k2 得到 3 之后变成 1.So 当它得到 k2<timeb.length
这意味着 1<1
这是错误的所以循环被终止。但是在那段时间 {4,5,6}
的 timea 没有被访问过。我想在执行完 else 语句后再次执行 if 语句 {4,5,6}
。
如何实现?
期望的输出:
1.0000 -1.0000 0.0000 0.0000 0.0000 0.0000
-1.0000 2.0000 -1.0000 0.0000 0.0000 0.0000
0.0000 -1.0000 2.0000 -1.0000 0.0000 0.0000
0.0000 0.0000 -1.0000 2.0000 -1.0000 0.0000
0.0000 0.0000 0.0000 -1.0000 2.0000 -1.0000
0.0000 0.0000 0.0000 0.0000 1.0000 -1.0000
在你的代码中,在你的 if
条件下,如果它们是 == 你就做某事,如果 timea[k1] < timeb[k2] 你就做某事,但如果 timea[ k1] > 时间 b[k2]。这就是为什么你错过了一些迭代。您可以处理这种情况或使 else >= 而不仅仅是 ==.
我想指出的另一件事是 Java 中接受了一些编码约定,您最好使用它们来获得可读代码。例如 BigOmega 应该用小写字母称为 bigOmega。
最后一件事是你的 while 循环。您可以这样做,这将使它比重复代码更具可读性。
while (k1 < timea.length && k2 < timeb.length ) {
omega.setAsInt(1, k1, k1);
omega.setAsInt(-1, k1, k1 + 1);
omega.setAsInt(-1, k1 + 1, k1);
omega.setAsInt(1, k1 + 1, k1 + 1);
Bigomega = Bigomega.plus(omega);
omega.clear();
if (timea[k1] < timeb[k2])
k1++;
else
k2++;
}
我的代码:
import org.ujmp.core.Matrix;
import org.ujmp.core.SparseMatrix;
public class part {
public static void main(String args[]) throws Exception{
Matrix Bigomega=Matrix.Factory.zeros(6,6);
Matrix omega = SparseMatrix.Factory.zeros(6, 6);
int []timea={1,2,3,4,5,6};
int [] timeb={3};
int k1=0,k2=0;
while (k1 < timea.length && k2 < timeb.length ) {
if (timea[k1] < timeb[k2]) {
omega.setAsInt(1, k1, k1);
omega.setAsInt(-1, k1, k1 + 1);
omega.setAsInt(-1, k1 + 1, k1);
omega.setAsInt(1, k1 + 1, k1 + 1);
Bigomega = Bigomega.plus(omega);
omega.clear();
k1++;
}
else if (timea[k1] == timeb[k2]){
omega.setAsInt(1, k1, k1);
omega.setAsInt(-1, k1, k1 + 1);
omega.setAsInt(-1,k1+1,k1);
omega.setAsInt(1,k1+1,k1+1);
Bigomega=Bigomega.plus(omega);
omega.clear();
k2++;
}
}
System.out.println(Bigomega);
}
}
输出:
1.0000 -1.0000 0.0000 0.0000 0.0000 0.0000
-1.0000 2.0000 -1.0000 0.0000 0.0000 0.0000
0.0000 -1.0000 2.0000 -1.0000 0.0000 0.0000
0.0000 0.0000 -1.0000 1.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
不需要的输出。得到timea[k1] == timeb[k2]
后,循环在这里终止。但我希望在从 timea 和 timeb 获得相似元素后,循环继续,直到访问 timea 的所有元素。根据我的代码,它从 timea 数组访问 1,2,3,然后丢弃。这是非常明显的,因为 while 语句 while (k1 < timea.length && k2 < timeb.length )
。因为当它得到循环计数器时 k2++
k2 递增 1。所以在从 timeb k2 得到 3 之后变成 1.So 当它得到 k2<timeb.length
这意味着 1<1
这是错误的所以循环被终止。但是在那段时间 {4,5,6}
的 timea 没有被访问过。我想在执行完 else 语句后再次执行 if 语句 {4,5,6}
。
如何实现?
期望的输出:
1.0000 -1.0000 0.0000 0.0000 0.0000 0.0000
-1.0000 2.0000 -1.0000 0.0000 0.0000 0.0000
0.0000 -1.0000 2.0000 -1.0000 0.0000 0.0000
0.0000 0.0000 -1.0000 2.0000 -1.0000 0.0000
0.0000 0.0000 0.0000 -1.0000 2.0000 -1.0000
0.0000 0.0000 0.0000 0.0000 1.0000 -1.0000
在你的代码中,在你的 if
条件下,如果它们是 == 你就做某事,如果 timea[k1] < timeb[k2] 你就做某事,但如果 timea[ k1] > 时间 b[k2]。这就是为什么你错过了一些迭代。您可以处理这种情况或使 else >= 而不仅仅是 ==.
我想指出的另一件事是 Java 中接受了一些编码约定,您最好使用它们来获得可读代码。例如 BigOmega 应该用小写字母称为 bigOmega。
最后一件事是你的 while 循环。您可以这样做,这将使它比重复代码更具可读性。
while (k1 < timea.length && k2 < timeb.length ) {
omega.setAsInt(1, k1, k1);
omega.setAsInt(-1, k1, k1 + 1);
omega.setAsInt(-1, k1 + 1, k1);
omega.setAsInt(1, k1 + 1, k1 + 1);
Bigomega = Bigomega.plus(omega);
omega.clear();
if (timea[k1] < timeb[k2])
k1++;
else
k2++;
}