Java 学习笔记(基础篇10)

1. 综合练习

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

题目需求

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

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

(2) 将输入字符串中的每个数字字符,按照罗马数字规则(0 对应空字符串,1 对应 I2 对应 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 集合,每个用户包含 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" 的用户是否存在,并打印结果。

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 对象里获取的 idString 类型变量,比如 u1id"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类型)。