字符串数组和命令行参数
一、字符串数组
下面程序会将字符串数组的各个元素初始化为"Turbo" 、"NA" 、"DOHC"并显示:
package com.example;// 字符串数组
class StringArray1 {
public static void main(String[] args) {
String[] sx = {"Turbo", "NA", "DOHC"};
for (int i = 0; i < sx.length; i++)
System.out.println("sx[" + i + "] = \"" + sx[i] + "\"");
}
}
输出:
将各个元素的初始值用逗号分隔,并用大括号{}括起来的形式与int型和double型等数组的初始值相同;
本和序中的数组sx如下图所示:String [] 型的数组变量SX引用的是元素类型为String 、元素个数为3的数组主体, 而各个元素sx[0]、SX[1]、SX[2]则分别引用了"Turbo" 、"NA"、"DOHC";
使用其他方法显示该数组的程序如下,会逐个地历各个字符串中的字符并进行显示:
package com.example;// 字符串数组(逐个显示字符)
class StringArray2 {
public static void main(String[] args) {
String[] sx = {"Turbo", "NA", "DOHC"};
for (int i = 0; i < sx.length; i++) {
System.out.print("sx[" + i + "] = \"");
for (int j = 0; j < sx[i].length(); j++)
System.out.print(sx[i].charAt(j));
System.out.println('\"');
}
}
}
输出:
sx.length 是数组SX的长度(元素个数);sx[i].length()是各个字符串sx[i]的长度(字符个数)
将字符串一个一个地读入到字符串数组的元素中并显示各个元素的值,程序如下:
package com.example;// 字符串数组(读入并显示)
import java.util.Scanner;
class ReadStringArray {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("字符串的个数:");
int n = stdIn.nextInt();
String[] sx = new String[n];
for (int i = 0; i < sx.length; i++) {
System.out.print("sx[" + i + "] = ");
sx[i] = stdIn.next();
}
for (int i = 0; i < sx.length; i++)
System.out.println("sx[" + i + "] = \"" + sx[i] + "\"");
}
}
输出:stdIn.next()会创建一个String型实例, 以保存读入的字符串,并返回该实例的引用;返回的引用被赋给sx[i], 因此各个元素引用的就是各个字符串的实例
猜拳
作为字符串数组的应用示例,创建一个猜拳游戏的程序:
package com.example;// 猜拳
import java.util.Scanner;
import java.util.Random;
class FingerFlashing {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
Random rand = new Random();
String[] hands = {"石头", "剪刀", "布"};
int retry; // 再来一次吗?
do {
// 生成0, 1, 2的随机数,作为计算机的手势
int comp = rand.nextInt(3);
// 读入玩家的手势0, 1, 2
int user;
do {
System.out.print("石头剪刀布");
for (int i = 0; i < 3; i++)
System.out.printf("(%d)%s ", i, hands[i]);
System.out.print(":");
user = stdIn.nextInt();
} while (user < 0 || user > 2);
// 显示双方的手势
System.out.println("我出" + hands[comp] + ",你出" +
hands[user] + "。");
// 判断
int judge = (user - comp + 3) % 3;
switch (judge) {
case 0: System.out.println("平局。"); break;
case 1: System.out.println("你输了。"); break;
case 2: System.out.println("你赢了。"); break;
}
// 确认是否再来一次
do {
System.out.print("再来一次? (0)否 (1)是:");
retry = stdIn.nextInt();
} while (retry != 0 && retry != 1);
} while (retry == 1);
}
}
输出:
String[] hands = {"石头", "剪刀", "布"};
上述程序是表示手势的字符串数组的声明,"石头"、"剪刀"、"布"的索引分别为0、1 、2;
int comp = rand.nextInt(3);
上述程序处使用随机数0、1、2来决定计算机的手势,如果在读入玩家的手势之后再进行该项处理,计算机就有可能作弊,因此在读入玩家手势之前先执行了该项处理;
int user;
do {
System.out.print("石头剪刀布");
for (int i = 0; i < 3; i++)
System.out.printf("(%d)%s ", i, hands[i]);
System.out.print(":");
user = stdIn.nextInt();
} while (user < 0 || user > 2);
上述代码读入玩家的手势,如果要输入字符串"石头"、"剪刀"、"布",那么有可能会输入错别字。
因此、这里将三个字符串显示为选项, 让玩家输入相应的数值;程序只接收0、1 、2这三个数值,当输入了其他的数值时,程序会要求冉次输入。
// 判断
int judge = (user - comp + 3) % 3;
switch (judge) {
case 0: System.out.println("平局。"); break;
case 1: System.out.println("你输了。"); break;
case 2: System.out.println("你赢了。"); break;
}
上述代码根据计算机和玩家的手势来判断胜负,判断的情形如下图:
1)平局
如果user和comp的值相等,则为平局,user - comp 的值为0;
2)玩家胜利
在下图所示的0、1、2、0、1、2......的循环中,箭头的起点方向为胜利, 终点方向为失败;在玩家为起点、计算机为终点的组合中,判断玩家胜利。此时ser - comp的值为-1或者2;
3)玩家失败
在玩家为终点、计算机为起点的组合中,判断玩家失败。此时user - comp的值为-2或者1;
这三个判断都可以通过共同的表达式(user - comp + 3) %3来执行, 如果表达式的值为0、则为平局;如果为1, 则玩家失败;如果为2, 则玩家胜利
二、命令行参数
Java程序在启动时会接收传入的命令行参数,传入的命令行参数会在程序启动后(即main方法开始执行之前),作为main方法的参数进行传递。下面的程序会显示接收到的命令行参数:
// 显示命令行参数
class PrintArgs {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++)
System.out.println("args[" + i + "] = " + args[i]);
}
}
输出:运行PrintArgs程序时, 传入"Turbo"、"NA"、"DOHC"等命令行参数,像下面这样进行启动
main方法的参数args中会接收”以各个命令行参数字符串,'Turbo" 、"NA"、"DOHC"的引用为元素的数组” 的引川, 如图
持有各个字符串的String型实例以及引用它的String型数组都是由Java虚拟机自动创建的。数组的元素个数与命令行参数的个数相等, 因此在本示例中, 元素个数为3。并且在main方法开始执行时创建的数组的引用会传递给参数args
在main方法中从命令行传入的各个参数会作为String型的数组args的元素进行处理;命令行参数的个数可以通过args.length来获取(因为args为数组);命令行参数是作为String []型的形参被main方法接收的
将字符串转换为数值
将从命令行参数传入的所有数值相加并显示其和的程序如下:
package com.example;// 将通过命令行参数传入的所有数值相加并显示
class SumOfArgs {
public static void main(String[] args) {
double sum = 0.0;
for (int i = 0; i < args.length; i++)
sum += Double.parseDouble(args[i]);
System.out.println("合计值为" + sum + "。");
}
}
输出:
sum += Double.parseDouble(args[i]);该表达式的形式如下:
Double.parseDouble(字符串)
这是调用Double类中的类方法parseDouble的表达式,将参数中传入的"123. 5"、"52.5346"等字符串转换为double型数值123.5、52.5346等, 并返回转换后的数值
三、总结
1、字符并不是通过拼写和发音, 而是通过字符编码被识别的。Java中采用的字符编码为Unicode, 字符是通过表示0~65535的无符号整数值的char型来表示的;
2、使用单引号将字符括起来的表达式'X'就是字符常量。字符'1'和数值1是不一样的;
3、表示字符串的类型为java.lang包中的String类类型;
4、字符串常量是用双引号将字符序列括起来的“...” 形式,是String型实例的引用;拼写相同的字符串常量引用的是同一个实例;
5、字符串的赋值并不是字符串的复制, 而是引用的复制;
6、String类中包含用于保存字符串的char型数组等字段,以及诸多的构造函数和方法;
7、当使用String .format方法时,可以执行格式化来创建字符串。格式化的指定与System.out.printf方法相同;
8、String型为引用类型, 因此”字符串数组” 中的各个元素并不是字符串本身, 而是各个字符串的引用;
9、当使用基木类型的包装类的parse...方法时, 可以将字符串转换为基本类型的数值;
10、当程序启动时,通过命令行传入的字符串数组可以通过main方法的参数来接收。
代码:
package com.example;// 处理字符串的程序
import java.util.Scanner;
class Test1 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("字符串s1:"); String s1 = stdIn.next();
System.out.print("字符串s2:"); String s2 = stdIn.next();
for (int i = 0; i < s1.length(); i++)
System.out.println("s1[" + i + "] = " + s1.charAt(i));
for (int i = 0; i < s2.length(); i++)
System.out.println("s2[" + i + "] = " + s2.charAt(i));
int idx = s1.indexOf(s2);
if (idx == -1)
System.out.println("s1中不包含s2。");
else
System.out.println("s1的第" + (idx + 1) + "个字符中包含s2。");
if (s1.equals(s2))
System.out.println("s1和s2的内容相等。");
else
System.out.println("s1和s2的内容不相等。");
for (int i = 1; i <= 4; i++) {
System.out.printf(String.format("%%%dd\n", i), 5);
}
System.out.println("将字符串\"123\"转换为整数值后的结果:" +
Integer.parseInt("123"));
System.out.println("将字符串\"123.45\"转换为浮点数值后的结果:" +
Double.parseDouble("123.45"));
}
}
输出:
代码:
package com.example;// 显示命令行参数和字符串数组
class Test2 {
static void printStringArray(String[] s) {
for (int i = 0; i < s.length; i++)
System.out.println("No." + i + " = " + s[i]);
}
public static void main(String[] args) {
String hands[] = {
"石头", "剪刀", "布"
};
System.out.println("命令行参数");
printStringArray(args);
System.out.println("猜拳的手势");
printStringArray(hands);
}
}
输出: