1. 综合练习
题目 1 :数字转罗马数字转换器
题目需求
编写一个 Java 程序,实现以下功能:
(1) 从控制台接收用户输入的一个字符串,要求该字符串必须是仅由数字组成 且长度不超过 9 位。若输入不符合规则,提示用户重新输入,直至输入符合要求为止。
(2) 将输入字符串中的每个数字字符,按照罗马数字规则(0
对应空字符串,1
对应 I
,2
对应 II
...... 9
对应 IX
)逐个转换为罗马数字。
(3) 把转换后的所有罗马数字拼接起来,输出最终结果。
java
public class test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str;
while (true) {
System.out.println("请输入一个字符串");
str = sc.next();
boolean flag = checkStr(str);
if (flag){
break;
} else{
System.out.println("当前的字符串不符合规则");
continue; //不太理解
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i); //不太理解
int number = c - 48;
String s = changeLuoMa(number);
sb.append(s);
}
System.out.println(sb);
}
public static String changeLuoMa(int number){
//使用查表法,但是我不太理解
String[] str = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
return str[number];
}
public static boolean checkStr(String str){
if (str.length() > 9){ //不太理解
return false;
}
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c < '0' || c > '9') {
return false;
}
}
return true;
}
}
关键逻辑:
① continue;
的作用
java
else {
System.out.println("当前的字符串不符合规则");
continue; // 不太理解
}
- 作用 :
continue
是循环控制语句,用于跳过当前循环的剩余代码,直接进入下一次循环。 - 场景说明 :当用户输入的字符串不符合规则时(比如包含非数字字符),程序会打印提示信息,然后通过
continue
直接回到while(true)
循环的开头,重新要求用户输入。
② 查表法 changeLuoMa
方法的理解
java
public static String changeLuoMa(int number) {
// 使用查表法,但是我不太理解
String[] str = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
return str[number];
}
- 查表法本质:用数组的索引对应需要转换的值,直接通过索引获取结果,避免复杂的逻辑判断。
题目 2:生成随机验证码
需求说明
请编写 Java 程序,生成一个长度为 5 的验证码,满足以下规则:
(1) 包含 4 位字母 (大小写均可,随机选取)和 1 位数字(0 - 9,随机选取);
(2) 数字的位置是随机的(可能在第 1、2、3、4、5 位中的任意一位);
(3) 最终通过 System.out.println
输出验证码。
java
package Test1;
import java.util.Random;
public class test8 {
public static void main(String[] args) {
// 生成验证码:5位长度,4位字母(大小写混合)+1位数字,数字位置随机
// 1. 准备字母库:a-z(26) + A-Z(26)
char[] letters = new char[52];
for (int i = 0; i < 26; i++) {
letters[i] = (char) ('a' + i); // 小写字母
letters[i + 26] = (char) ('A' + i); // 大写字母
}
Random random = new Random();
// 2. 随机确定数字要放的位置(0-4之间)
int numberPosition = random.nextInt(5);
// 3. 创建StringBuilder用于拼接验证码
StringBuilder codeBuilder = new StringBuilder();
// 4. 生成4个随机字母(临时存储)
char[] codeLetters = new char[4];
for (int i = 0; i < 4; i++) {
int index = random.nextInt(52);
codeLetters[i] = letters[index];
}
// 5. 生成1个随机数字
char number = (char) ('0' + random.nextInt(10));
// 6. 按位置拼接:先加字母,到数字位置时加数字,再继续加剩余字母
int letterIndex = 0; // 用于记录当前用到第几个字母
for (int i = 0; i < 5; i++) {
if (i == numberPosition) {
// 到达数字位置,添加数字
codeBuilder.append(number);
} else {
// 其他位置添加字母
codeBuilder.append(codeLetters[letterIndex]);
letterIndex++; // 字母索引后移
}
}
// 7. 输出结果
System.out.println("生成的验证码:" + codeBuilder.toString());
}
}
关键逻辑:
java
// 片段1:随机字母存储(存)
char[] codeLetters = new char[4];
for (int i = 0; i < 4; i++) {
int index = random.nextInt(52);
codeLetters[i] = letters[index]; // 关键:从字母库选字母,存到临时数组
}
// 片段2:随机字母拼接(用)
int letterIndex = 0;
for (int i = 0; i < 5; i++) {
if (i == numberPosition) {
codeBuilder.append(number);
} else {
codeBuilder.append(codeLetters[letterIndex]); // 关键:从临时数组取字母,拼到验证码
letterIndex++;
}
}
- 从 "临时数组(
codeLetters
)" 中按顺序取出之前存好的 4 个字母,拼接到StringBuilder
(验证码容器)中,与随机位置的数字共同组成 5 位验证码。
java
char number = (char) ('0' + random.nextInt(10))
- 最好不要写成 int,因为会破坏代码的可读性和维护性
2. 集合
(1) ArrayList 成员方法(要记下来)

(2) 包装类
基本数据类型 | 所对应的包装类 |
---|---|
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
(3) 综合练习
题目 1 :检查用户 ID 是否存在
任务描述
(1) 已知一个存储用户信息的 ArrayList
集合,每个用户包含 id
、username
、password
三个属性。请编写程序完成:
(2) 定义 User
类,包含上述三个属性,并提供构造方法和 getId()
方法(用于获取用户 ID)。
(3) 在主类中创建 3 个用户对象,信息如下:
- id="1",username="zhangsan",password="1234567"
- id="2",username="lisi",password="12345678"
- id="3",username="wangwu",password="123456789"
(4) 将这 3 个用户对象添加到 ArrayList<User>
集合中。
(5) 实现一个 contains
方法,功能是:接收用户集合和一个目标 ID,判断该 ID 是否存在于集合中(存在返回 true
,否则返回 false
)。
(6) 在 main
方法中调用 contains
方法检查 ID 为 "1" 的用户是否存在,并打印结果。
java
public class UserName {
public static void main(String[] args) {
ArrayList<User> list = new ArrayList<User>();
User u1 = new User("1","zhangsan","1234567");
User u2 = new User("2","lisi","12345678");
User u3 = new User("3","wangwu","123456789");
list.add(u1);
list.add(u2);
list.add(u3);
boolean flag = contains(list,"1");
System.out.println(flag);
}
public static boolean contains(ArrayList<User> list, String id){
for (int i = 0; i < list.size(); i++) {
User u = list.get(i);
String uid = u.getId();
if (uid.equals(id)) { //不太理解,格式长什么样
return true;
}
}
return false;
}
}
关键逻辑:
java
uid.equals(id)
基本格式 :字符串变量.equals(另一个字符串)
uid
:是从集合中的User
对象里获取的id
(String
类型变量,比如u1
的id
是"1"
)equals
:是String
类专门用来比较内容是否相同的方法id
:是传入的目标id
(方法参数,比如示例中的"1"
)
题目 2 :筛选低价手机
需求说明:
(1) 定义一个Phone
类,包含两个属性:brand
(品牌,String
类型)和price
(价格,int
类型),并提供:
- 带参构造方法(初始化品牌和价格);
getBrand()
和getPrice()
方法(用于获取属性值)。
(2) 在主类PhoneTest
中,完成创建 3 个手机对象,信息如下:
- 品牌 "小米",价格 1000 元;
- 品牌 "苹果",价格 8000 元;
- 品牌 "锤子",价格 2999 元。
(3) 将这 3 个手机对象添加到ArrayList<Phone>
集合中。
(4) 定义一个方法getPhoneInfo
,参数为手机集合(ArrayList<Phone>
),返回值为ArrayList<Phone>
:
- 功能:筛选出集合中所有 "价格低于 3000 元" 的手机对象;
- 实现:遍历原集合,判断每个手机的价格,将符合条件的对象添加到新集合中,最终返回新集合。
(5) 在main
方法中调用getPhoneInfo
方法,获取筛选结果,并遍历打印结果(格式:品牌 + 空格 + 价格)。
java
public class PhoneTest {
public static void main(String[] args) {
ArrayList<Phone> list = new ArrayList<Phone>();
Phone p1 = new Phone("小米",1000);
Phone p2 = new Phone("苹果",8000);
Phone p3 = new Phone("锤子",2999);
list.add(p1);
list.add(p2);
list.add(p3);
ArrayList<Phone> phoneInfoList = getPhoneInfo(list);
for (int i = 0; i < phoneInfoList.size(); i++) {
Phone phone = phoneInfoList.get(i);
System.out.println(phone.getBrand() + " " + phone.getPrice());
}
}
public static ArrayList<Phone> getPhoneInfo(ArrayList<Phone> list) {
ArrayList<Phone> resultList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Phone p = list.get(i);
int price = p.getPrice();
if (price < 3000){
resultList.add(p); //不太理解
}
}
return resultList;
}
}
关键逻辑:
java
resultList.add(p)
resultList
:是一个新创建的ArrayList<Phone>
集合,专门用于存储 "价格低于 3000 元" 的手机对象(筛选结果)。add(p)
:是ArrayList
的添加方法,用于将参数中的对象放入集合。这里的p
是从原集合中遍历得到的手机对象(Phone
类型)。