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

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.dtcms.com/a/350541.html

相关文章:

  • HTML应用指南:利用POST请求获取全国三星门店位置信息
  • 【目标跟踪】《FastTracker: Real-Time and Accurate Visual Tracking》论文阅读笔记
  • 目前城投债
  • MySQL常见报错分析及解决方案总结(1)---Can‘t connect to MySQL server on ‘localhost‘(10061)
  • Docker:技巧汇总
  • 利用matlab实现CST超表面阵列的自动建模
  • 数据结构:单链表(详解)
  • SSL移动接入方案和移动资源发布
  • 【学习笔记】怎么解决/dev/sda3: clean, XXX files, XXX blocks
  • 【Wrangler(Cloudflare 的官方 CLI)和 npm/npx 的区别一次讲清】
  • SpringCloud微服务技术自用笔记
  • day52_2025-08-25
  • 【猿人学】web第一届 第13题 入门级 cookie
  • 【动态规划】卡特兰数
  • 文件读取结束的判定方法:正确使用feof函数避免文件读取错误
  • CAN总线详解(四)CANFD报文结构
  • 小红书链接uid等批量转换,界面软件工具
  • 【COMSOL】COMSOL帮助文档无法打开的解决办法
  • 智能专网升级:4G与5G混合组网加速企业数字化转型
  • leetcode算法刷题的第十七天
  • 房地产模式的运行逻辑与内在风险
  • Acrobat DC 中的条件格式化
  • 失眠——记录安东尼威廉饮食习惯的250天
  • 推三返一链动模式裂变图解
  • 用Python的Requests+BeautifulSoup爬取微博热搜榜及话题内容
  • SSM从入门到实战:3.1 SpringMVC框架概述与工作原理
  • 音视频学习(五十八):STAP-A模式
  • 编写Linux下usb设备驱动方法:probe函数中要完成的任务
  • 麦特轮巡线避障小车开发
  • IEEE子刊 | 注意缺陷多动障碍的功能连接模式:近红外机器学习研究