当前位置: 首页 > java >正文

Java 学习笔记(基础篇10)

1. 综合练习

题目 1 :数字转罗马数字转换器

题目需求

编写一个 Java 程序,实现以下功能:

(1) 从控制台接收用户输入的一个字符串,要求该字符串必须是仅由数字组成长度不超过 9 位。若输入不符合规则,提示用户重新输入,直至输入符合要求为止。

(2) 将输入字符串中的每个数字字符,按照罗马数字规则(0 对应空字符串,1 对应 I2 对应 II …… 9 对应 IX )逐个转换为罗马数字。

(3) 把转换后的所有罗马数字拼接起来,输出最终结果。

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; 的作用

else {System.out.println("当前的字符串不符合规则");continue;  // 不太理解
}
  • 作用continue 是循环控制语句,用于跳过当前循环的剩余代码,直接进入下一次循环
  • 场景说明:当用户输入的字符串不符合规则时(比如包含非数字字符),程序会打印提示信息,然后通过 continue 直接回到 while(true) 循环的开头,重新要求用户输入。

② 查表法 changeLuoMa 方法的理解

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 输出验证码。

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());}
}

关键逻辑:

// 片段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 位验证码。
char number = (char) ('0' + random.nextInt(10))
  • 最好不要写成 int,因为会破坏代码的可读性和维护性

2. 集合

(1) ArrayList 成员方法(要记下来)

(2) 包装类

基本数据类型所对应的包装类
byteByte
shortShort
charCharacter
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean

(3) 综合练习

题目 1 :检查用户 ID 是否存在

任务描述

(1) 已知一个存储用户信息的 ArrayList 集合,每个用户包含 idusernamepassword 三个属性。请编写程序完成:

(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" 的用户是否存在,并打印结果。

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;}
}

关键逻辑:

uid.equals(id)

基本格式字符串变量.equals(另一个字符串)

  • uid:是从集合中的 User 对象里获取的 idString 类型变量,比如 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方法,获取筛选结果,并遍历打印结果(格式:品牌 + 空格 + 价格)。

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;}
}

关键逻辑:

resultList.add(p)
  • resultList:是一个新创建的ArrayList<Phone>集合,专门用于存储 “价格低于 3000 元” 的手机对象(筛选结果)。
  • add(p):是ArrayList的添加方法,用于将参数中的对象放入集合。这里的p是从原集合中遍历得到的手机对象(Phone类型)。
http://www.xdnf.cn/news/18776.html

相关文章:

  • Qwen2-Plus与DeepSeek-V3深度测评:从API成本到场景适配的全面解析
  • Coze用户账号设置修改用户头像-后端源码
  • 大模型的多机多卡训练
  • 09-数据存储与服务开发
  • 深度学习分类网络初篇
  • react+taro打包到不同小程序
  • Nginx与Apache:Web服务器性能大比拼
  • Docker:技巧汇总
  • 连锁零售排班难?自动排班系统来解决
  • Swiper属性全解析:快速掌握滑块视图核心配置!(2.3补充细节,详细文档在uniapp官网)
  • 从C语言到数据结构:保姆级顺序表解析
  • 数据库之两段锁协议相关理论及应用
  • 前端开发:详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系
  • Ansible 任务控制与事实管理指南:从事实收集到任务流程掌控
  • 面向过程与面向对象
  • AP服务发现中两条重启检测路径
  • Linux系统操作编程——http
  • 逆向抄数工程师能力矩阵:设备操作(±0.05mm 精度)× 曲面重构 ×GDT 公差分析
  • springboot项目每次启动关闭端口仍被占用
  • CTFshow系列——命令执行web53-56
  • GO学习记录八——多文件封装功能+redis使用
  • Coze用户账号设置修改用户昵称-前端源码
  • Vue 3 defineOptions 完全指南:让组件选项声明更现代化
  • `lock()` 和 `unlock()` 线程同步函数
  • Node.js(1)—— Node.js介绍与入门
  • maven-default-http-blocker (http://0.0.0.0/)
  • 设计模式4-建造者模式
  • 【AI论文】LiveMCP-101:针对支持多主体通信协议(MCP)的智能体在复杂查询场景下的压力测试与故障诊断
  • iptables 防火墙技术详解
  • 【AI编程】如何快速通过AI IDE集成开发工具来生成一个简易留言板系统