Java 嵌套 for 循环(内部 for 循环中有 if 语句)
Java Nested for loop ( with if statement in inner for loop )
我正在尝试使用 JavaFX 创建一个棋盘。行和列由输入确定。最后一个框必须是白色的。如果我以奇数开头,我的代码有效,但如果我以偶数开头,则我的代码无效。我不确定 if-else if 语句有什么问题。我已经盯着它看了好几个小时了。请帮忙!
package application;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
/**
Java FX Hello World using a Label.
*/
public class VG_CheckerBoard0 extends Application
{
int columnIndex, rowIndex;
boolean nOdd;
@Override
public void start(Stage stage)
{
//get n from user
int n= Integer.parseInt(JOptionPane.showInputDialog("Please input a number to make checkerboard: "));
//create gridpane
GridPane gridpane = new GridPane();
gridpane.setGridLinesVisible(true);
// Create array of boxes
TextField[][] box = new TextField[n][n];
//set initial value of nOdd
if ( n%2 == 0 ){
nOdd = false;
System.out.println(nOdd);
}
else {
nOdd = true ;
System.out.println(nOdd);
}
//populate array of boxes, set color and position for each
for(int c= 0; c<box.length;c++){
for(int r= 0; r<box.length;r++){
box[c][r] = new TextField("x");
//System.out.println(box[c][r]);
if (nOdd == true){
box[c][r].setStyle("-fx-background-color: white;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " - inside if true before ");
nOdd = false;
System.out.println(nOdd + " - inside if true after");
}else if (nOdd == false){
box[c][r].setStyle("-fx-background-color: black;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " + inside if false before");
nOdd = true;
System.out.println(nOdd + " + inside if false after");
}
gridpane.add(box[c][r], c, r);
}//inner
}//outer
// Set label as the root of scene graph.
Scene scene = new Scene(gridpane);
stage.setScene(scene);
// Set stage title and show the stage.
stage.setTitle("Checkerboard");
stage.show();
}
public static void main(String[] args){
launch(args);
}
}
下面的示例输出(奇数工作,棋盘格模式)。
发生的事情是,由于外循环是针对列的,并且数字被标识为 even
,它将为该列中的所有行交替黑白,但将为后续列重置。例如
initial value for nOdd = false
c = 0 c = 1 .. the process repeats again
|column 0|column 1|column 2|column3
it's alternating ------> |black |black nOdd = true
row-wise |--> |white |white nOdd = false
|black |black nOdd = true
|white |white nOdd = false
nOdd came full circle so it starts back in black again
它适用于奇数,因为一切都正确对齐
initial value for nOdd = true
c = 0 c = 1 .. the process repeats again
|column 0|column 1|column 2
it's alternating ------> |white |black nOdd = false
row-wise |--> |black |white nOdd = true
|white |black nOdd = false
nOdd started as true and ended as false so for the next column we get alternating colors
一个快速解决方法是检查 n
是否确实是偶数,一旦你完成了内部循环的所有迭代,然后 xor
变量 nOdd
和 true
(一种奇特的说法,"toggle" 值)
for(int c= 0; c<box.length;c++){
for(int r= 0; r<box.length;r++){
box[c][r] = new TextField("x");
//System.out.println(box[c][r]);
if (nOdd == true){
box[c][r].setStyle("-fx-background-color: white;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " - inside if true before ");
nOdd = false;
System.out.println(nOdd + " - inside if true after");
}else if (nOdd == false){
box[c][r].setStyle("-fx-background-color: black;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " + inside if false before");
nOdd = true;
System.out.println(nOdd + " + inside if false after");
}
gridpane.add(box[c][r], c, r);
}//inner
if(n % 2 == 0) {
nOdd = nOdd ^ true;
}
}//outer
您还可以使用索引 r
和 c
来决定单元格的颜色。次要细节,因为 Java 是行优先的,所以将 r
作为大 n
的外部变量可能会更好,但我假设你不希望有巨大的价值对于 n
所以不要太担心这个。
我正在尝试使用 JavaFX 创建一个棋盘。行和列由输入确定。最后一个框必须是白色的。如果我以奇数开头,我的代码有效,但如果我以偶数开头,则我的代码无效。我不确定 if-else if 语句有什么问题。我已经盯着它看了好几个小时了。请帮忙!
package application;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
/**
Java FX Hello World using a Label.
*/
public class VG_CheckerBoard0 extends Application
{
int columnIndex, rowIndex;
boolean nOdd;
@Override
public void start(Stage stage)
{
//get n from user
int n= Integer.parseInt(JOptionPane.showInputDialog("Please input a number to make checkerboard: "));
//create gridpane
GridPane gridpane = new GridPane();
gridpane.setGridLinesVisible(true);
// Create array of boxes
TextField[][] box = new TextField[n][n];
//set initial value of nOdd
if ( n%2 == 0 ){
nOdd = false;
System.out.println(nOdd);
}
else {
nOdd = true ;
System.out.println(nOdd);
}
//populate array of boxes, set color and position for each
for(int c= 0; c<box.length;c++){
for(int r= 0; r<box.length;r++){
box[c][r] = new TextField("x");
//System.out.println(box[c][r]);
if (nOdd == true){
box[c][r].setStyle("-fx-background-color: white;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " - inside if true before ");
nOdd = false;
System.out.println(nOdd + " - inside if true after");
}else if (nOdd == false){
box[c][r].setStyle("-fx-background-color: black;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " + inside if false before");
nOdd = true;
System.out.println(nOdd + " + inside if false after");
}
gridpane.add(box[c][r], c, r);
}//inner
}//outer
// Set label as the root of scene graph.
Scene scene = new Scene(gridpane);
stage.setScene(scene);
// Set stage title and show the stage.
stage.setTitle("Checkerboard");
stage.show();
}
public static void main(String[] args){
launch(args);
}
}
下面的示例输出(奇数工作,棋盘格模式)。
发生的事情是,由于外循环是针对列的,并且数字被标识为 even
,它将为该列中的所有行交替黑白,但将为后续列重置。例如
initial value for nOdd = false
c = 0 c = 1 .. the process repeats again
|column 0|column 1|column 2|column3
it's alternating ------> |black |black nOdd = true
row-wise |--> |white |white nOdd = false
|black |black nOdd = true
|white |white nOdd = false
nOdd came full circle so it starts back in black again
它适用于奇数,因为一切都正确对齐
initial value for nOdd = true
c = 0 c = 1 .. the process repeats again
|column 0|column 1|column 2
it's alternating ------> |white |black nOdd = false
row-wise |--> |black |white nOdd = true
|white |black nOdd = false
nOdd started as true and ended as false so for the next column we get alternating colors
一个快速解决方法是检查 n
是否确实是偶数,一旦你完成了内部循环的所有迭代,然后 xor
变量 nOdd
和 true
(一种奇特的说法,"toggle" 值)
for(int c= 0; c<box.length;c++){
for(int r= 0; r<box.length;r++){
box[c][r] = new TextField("x");
//System.out.println(box[c][r]);
if (nOdd == true){
box[c][r].setStyle("-fx-background-color: white;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " - inside if true before ");
nOdd = false;
System.out.println(nOdd + " - inside if true after");
}else if (nOdd == false){
box[c][r].setStyle("-fx-background-color: black;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " + inside if false before");
nOdd = true;
System.out.println(nOdd + " + inside if false after");
}
gridpane.add(box[c][r], c, r);
}//inner
if(n % 2 == 0) {
nOdd = nOdd ^ true;
}
}//outer
您还可以使用索引 r
和 c
来决定单元格的颜色。次要细节,因为 Java 是行优先的,所以将 r
作为大 n
的外部变量可能会更好,但我假设你不希望有巨大的价值对于 n
所以不要太担心这个。