5.1 分支语句
if else
isLeapYear(int year)
方法用来判断某一年是否为闰年。
public boolean isLeapYear(int year) {
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return true;
else
return false;
}
if 后面的表达式必须是布尔表达式,而不能为数字类型,这一 点与 C/C++ 语言不同。
switch
在 switch(expr) 语句中, expr 表达式的类型包括以下几种:
- 与 int 类型兼容的基本类型,所谓与 int 类型兼容,就是指能自动转换为 int。类型 。 因此 expr 表达式的合法类型包括: byte 、 short 、 char 和 int 类型。 long和浮点类型不能自动转换为 int 类型,因此不能作为 expr 表达式的类型,
- 字符串类型。
- 枚举类型。
String color = "red";
switch(color) {
case "blue":
/* TODO */
break;
case "red":
/* TODO */
break;
...
}
public class SwitchTest {
enum Color{red, blue, yellow};
public static void main(String[] args) {
Color c = Color.blue;
switch(c) {
case blue:
/* TODO */
break;
case red:
/* TODO */
break;
...
}
}
}
5.2 循环语句
Java 语言提供 3 种循环语句: for 语句、 while 语句和 do while 语句 。 for 和 while语句在执行循环体之前测试循环条件,而 do while 语句在执行完循环体之后测试循环条件。这意味着 for 和 while 语句有可能连一次循环体都未执行,而 do while 循环至少执行一次循环体。
max(int[] array)
方法能返回整数数组中的最大值。
public static int max(int[] array) {
if (array == null || array.length == 0)
throw new IllegalArgumentException("Invaid");
int index = 0, location = 0;
do {
if (array[location] < array[[index]])
location = index;
index++;
} while (index < array.length);
return array[location];
}
在初始化部分和迭代部分可以使用逗号语句。逗号语句是用逗号分隔的语句序列。以下 inverse()
方法用于颠倒数组中元素的顺序。在 for 语句的初始化部分定义了两个变量 i 和 j,这两个变量的作用域都是当前 for 语句。
public static int[] inverse(int[] oldArray) {
if (array == null || array.length == 0)
throw new IllegalArgumentException("Invalid");
int[] newArray = new int[oldArray.length];
for (int i = 0, j = oldArray.length - 1; i < oldArrat.length; i++, j--) {
newArray[j] = oldArray[i];
}
return newArray;
}
使用 for 语句时,有以下注意事项:
- 如果 for 语句的循环体只有 一条语句,可以不用大括号。
- 控制 for 循环的变量常常只用于本循环,而不用在程序的其他地方。
- 在初始化部分和迭代部分可以使用逗号语句。
- for 语句的初始化部分、循环条件或者迭代部分都可以为空。
- 作为一种编程惯例, for 语句一般用在循环次数事先可确定的情况,而 while 和 do while 用在循环次数事先不可确定的清况。
foreach 语句是 for 语句的特殊简化版本,它可以简化遍历数组和集合的程序代码。
for (Element e : Collection) {
/* DO e */
}
5.3 流程跳转语句
break、continue 和 return 语句用来控制流程的跳转。
- break: 从 switch 语句、循环语句或标号标识的代码块中退出。
- continue: 跳过本次循环,执行下一次循环,或执行标号标识的循环体。
- return: 退出本方法,跳到上层调用方法:如果本方法的返回类型不是 void,需要提供相应的返回值。
break 语句和 continue 沿句可以与标号联合使用。标号用来标识程序中的语句 ,标号的名字可以是行总的合法标识符。
int counter = 0;
tag1:
for (int i = 0; i < 5; i++) {
tag3:counter--;
tag2:
switch(i) {
case 0:
break; //exit switch
case 1:
break tag2; //exit switch
case 3:
break tag1; //exit for loop
default:
continue tag1; //结束本轮for循环,执行下一次for循环
}
}
在使用标号时,有以下注意事项:
- 在语法上 ,标号可用来标识除变量声明语句之外的任何有效语句。
- continue 语句中的标号必须定义在 while、 do while 和 for 循环语句前面。
- break 语句中的标号必须定义在 while、 do while 和 for 循环语句或 switch 语句前面。
为了简化程序的结构,目前的 Java 语言不支持 goto 语句,在其他编程语言中, goto 语句用于直接跳转到标号所在的语句 。 例如在 C 语言 中, goto tag3
表示跳转到 tag3 所标识的语句 counter++
。但由于 Java 语言不支持 goto 语句,因此 tag3 标号没有任何意义。目前只有在 while 、 do while 和 for 循环语句或 switch 语句前面的标号才有实际意义。
5.4 综合例子:八皇后问题
public class Queen{
private final int size; //棋盘大小
private int[] location; //皇后在棋盘每行上的列位置
private int[] colsOccupied; //皇后在棋盘上占据的列
private int[] cross1Occupied;
private int[] cross2Occupied; //皇后在棋盘上占据的正反对角线
private static int count; //解决方案
private static final int STATUS_OCCUPIED = 1; //占领状态
private static final int STATUS_OCCUPY_CANCELD = 0; //未占领状态
public Queen(int size) { //初始化
this.size = size;
location = new int[size];
colsOccupied = new int[size];
cross1Occupied = new int[2 * size];
cross2Occupied = new int[2 * size];
}
public void printLocation() {
System.out.println("第" + count + "种摆放方案");
for (int i = 0; i < size; i++)
System.out.println("行:" + i + "列:" + location[i]);
}
private boolean isOccupied(int i, int j) {
return (colsOccupied[j] == STATUS_OCCUPIED)
|| (cross1Occupied[i - j + size - 1] == STATUS_OCCUPIED)
|| (cross2Occupied[i + j] == STATUS_OCCUPIED);
}
private void setStatus(int i, int j, int flag) {
colsOccupied[j] = flag;
cross1Occupied[i - j + size - 1] = flag;
cross2Occupied[i + j] = flag;
}
public void place(int i) {
for (int j = 0; j < size; j++) {
if (!isOccupied(i, j)) {
location[i] = j;
setStatus(i, j, STATUS_OCCUPIED);
if (i < size - 1)
place(i + 1);
else {
count++;
printLocation();
}
setStatus(i, j, STATUS_OCCUPY_CANCELD);
}
}
}
public void start() {
place(0);
}
public static void main(String[] args) {
new Queen(8).start();
}
}
运行以上程序,会得到 92 种摆放 8 个皇后的方案。