题目1(训练)

现已知工人(Worker)类,属性包含姓名(name)、工龄(year),请编写该类,提供构造方法和get、set方法。在测试类中,请查看键盘录入Scanner类的API,创建工人类对象,属性值由键盘录入,打印对象的属性值。输出效果如下:

  1. 请录入工人姓名:
  2. 张三
  3. 请录入工人工龄:
  4. 5
  5. 该工人对象的属性信息如下:
  6. 姓名:张三
  7. 工龄:5

训练目标

编写简单的java类,创建对象,查询API。

训练提示

1、怎样编写一个标准的描述工人的类?

2、创建工人对象时需要两个属性信息,由键盘录入,该使用哪个API?

3、创建对象之后,显示对象的属性信息,该调用哪个方法?

参考方案

训练步骤

1、创建Worker类,成员变量私有修饰,提供空参和全参构造方法,提供get和set方法。

2、创建Test01类,在主方法中,创建键盘录入Scanner对象。

  1. 2.1、姓名信息为字符串,使用ScannernextLine()方法。
  2. 2.2、工龄信息为整数,使用ScannernextInt()方法。

3、创建Worker类对象,并输出对象的成员变量值。

  1. 3.1、可以在创建对象时使用构造方法为成员变量赋值,也可以创建对象后使用set方法赋值。
  2. 3.2、获取成员变量的值,使用get方法。

参考答案

  1. public class Worker {
  2. // 成员变量
  3. private String name;
  4. private int year;
  5. // 构造方法
  6. public Worker() {
  7. }
  8. public Worker(String name, int age) {
  9. this.name = name;
  10. this.year = age;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getYear() {
  19. return year;
  20. }
  21. public void setYear(int year) {
  22. this.year = year;
  23. }
  24. }
  25. import java.util.Scanner;
  26. public class Test01 {
  27. public static void main(String[] args) {
  28. // 创建键盘录入对象
  29. Scanner sc = new Scanner(System.in);
  30. System.out.println("请输入工人姓名:");
  31. String name = sc.nextLine();
  32. System.out.println("请输入工人工龄:");
  33. int year = sc.nextInt();
  34. // 创建对象
  35. Worker w = new Worker(name, year);
  36. // 输出信息
  37. System.out.println("该工人对象的信息如下:");
  38. System.out.println("姓名:" + w.getName());
  39. System.out.println("工龄:" + w.getYear());
  40. }
  41. }

题目2(应用)

在登录注册页面中,除了用户名和密码外,通常也会包含验证码。验证码是用来区分用户是计算机还是人,防止恶意破解密码、刷票、灌水等行为。请查看Random、StringBuilder相关API,定义方法,获取一个包含4个字符的验证码,每一位字符是随机选择的字母和数字,可包含a-z,A-Z,0-9。例如:

  1. 7Kt5

训练目标

随机数类Random相关API、可变的字符序列StringBuilder相关API

训练提示

1、功能需要定义方法实现,方法的返回值是什么?需要参数列表吗?

2、先将可选择的字符都放到一个StringBuilder对象中。

3、怎样随机获取其中的四个字符呢?如果能随机获取一个,再获取四次,就可以了。那么怎样随机获取一个呢?我们知道,字符串中的字符是有索引的,如果可以随机获取到一个索引,就相当于随机获取到了该索引上的字符。

参考方案

训练步骤

1、定义方法,返回值是String,参数列表为空。

2、定义StringBuilder对象,将可选择的字符都放到StringBuilder对象中。

  1. 2.1、定义循环从a-z,使用StringBuilderappend方法依次添加所有小写字母
  2. 2.2、定义循环从A-Z,使用StringBuilderappend方法依次添加所有大写字母
  3. 2.3、定义循环从0-9,使用StringBuilderappend方法依次添加所有数字字符

3、创建Random对象。定义一个空字符串用于保存验证码。

4、定义一个执行4次的循环,用于获取4个字符。

  1. 4.1、在循环中,使用RandomnextInt方法,随机获取一个从索引0(包含)到字符串的长度(不包含)的索引。
  2. 4.2、使用StringBuildercharAt方法,获取该索引上的字符,将其拼接到验证码字符串中。

5、返回结果,并在主方法中调用方法查看结果。

参考答案

  1. import java.util.Random;
  2. public class Test02 {
  3. public static void main(String[] args) {
  4. String code = getRandomCode();
  5. System.out.println(code);
  6. }
  7. public static String getRandomCode() {
  8. // 准备数据,将可选择的字符都放入StringBuilder中
  9. StringBuilder sb = new StringBuilder();
  10. for (char ch = 'a'; ch <= 'z'; ch++) {
  11. sb.append(ch);
  12. }
  13. for (char ch = 'A'; ch <= 'Z'; ch++) {
  14. sb.append(ch);
  15. }
  16. for (char ch = '0'; ch <= '9'; ch++) {
  17. sb.append(ch);
  18. }
  19. // 随机获取四位
  20. Random r = new Random();
  21. String code = "";
  22. for (int i = 0; i < 4; i++) {
  23. // 字符串中的字符有索引,随机获取一个索引即相当于随机获取到了该索引的字符
  24. int index = r.nextInt(sb.length()); // 从索引0(包含)到字符串的长度(不包含)
  25. code += sb.charAt(index); // 获取该索引上的字符
  26. }
  27. // 返回结果
  28. return code;
  29. }
  30. }

题目3(应用)

在登录注册页面中,除了用户名和密码外,通常也会包含验证码。验证码是用来区分用户是计算机还是人,防止恶意破解密码、刷票、灌水等行为。在判断验证码时一般不区分大小写。请编写程序模拟验证码的判断过程,如果输入正确,给出提示,结束程序。如果输入错误,给出提示,验证码刷新,重新输入,直至正确为止。

生成4位随机验证码的功能在之前的题目中已经完成,可以直接使用。《定义方法,获取一个包含4个字符的验证码,每一位字符是随机选择的字母和数字,可包含a-z,A-Z,0-9。》

运行效果如下:

  1. 生成的验证码为:BkhD
  2. 请输入验证码
  3. abcd
  4. 输入错误,请重新输入...
  5. 生成的验证码为:n1wX
  6. 请输入验证码
  7. aaaa
  8. 输入错误,请重新输入...
  9. 生成的验证码为:Fm1a
  10. 请输入验证码
  11. fm1a
  12. 输入正确

训练目标

字符串的判断功能

训练提示

1、先定义获取验证码的方法,完成获取验证码的功能。

2、根据题目要求,判断需要一直到输入正确为止,所以需要使用循环。

3、用户输入由键盘录入,需要创建键盘录入对象。

4、判断是否正确需要将用户输入的字符串与生成的验证码比较,但不区分大小写,所以该使用哪个方法呢?

5、判断相等,给出提示,结束循环。判断不相等,给出提示,进入下一次循环。

参考方案

训练步骤

1、定义方法,实现获取包含4个字符的随机验证码。(参考以前的练习)

2、创建键盘录入Scanner对象。

3、定义while循环,循环条件为true。

4、在循环内,获取程序生成的验证码,提示用户输入,调用Scanner对象的nextLine方法获取用户输入。

5、使用String的equalsIgnoreCase方法比较生成的验证码和用户输入,因为不区分大小写。

  1. 5.1、如果相等,给出输入正确的提示,使用break语句跳出循环。
  2. 5.2、如果不相等,给出输入错误的提示,继续下一次循环。

参考答案

  1. import java.util.Random;
  2. import java.util.Scanner;
  3. public class Test03 {
  4. public static void main(String[] args) {
  5. // 键盘录入对象
  6. Scanner sc = new Scanner(System.in);
  7. while (true) { // 不清楚输入多少次,定义死循环,输入正确时跳出即可。
  8. String code = getRandomCode();
  9. System.out.println("生成的验证码为:" + code);
  10. System.out.println("请输入验证码");
  11. String line = sc.nextLine();
  12. // 不区分大小写比较是否相等
  13. if (code.equalsIgnoreCase(line)) {
  14. System.out.println("输入正确");
  15. break; // 跳出循环,结束程序
  16. } else {
  17. System.out.println("输入错误,请重新输入...");
  18. }
  19. }
  20. }
  21. public static String getRandomCode() {
  22. // 准备数据
  23. StringBuilder sb = new StringBuilder();
  24. for (char ch = 'a'; ch <= 'z'; ch++) {
  25. sb.append(ch);
  26. }
  27. for (char ch = 'A'; ch <= 'Z'; ch++) {
  28. sb.append(ch);
  29. }
  30. for (char ch = '0'; ch <= '9'; ch++) {
  31. sb.append(ch);
  32. }
  33. // 随机获取四位
  34. Random r = new Random();
  35. String code = "";
  36. for (int i = 0; i < 4; i++) {
  37. // 字符串中的字符有索引,随机获取一个索引即相当于随机获取到了该索引的字符
  38. int index = r.nextInt(sb.length()); // 从索引0(包含)到字符串的长度(不包含)
  39. code += sb.charAt(index); // 获取该索引上的字符
  40. }
  41. // 返回结果
  42. return code;
  43. }
  44. }

题目4(训练)

请编写程序,由键盘录入一个字符串,统计字符串中英文字母和数字分别有多少个。比如:Hello12345World中字母:10个,数字:5个。

训练目标

字符串遍历

训练提示

1、键盘录入一个字符串,用 Scanner 实现
2、要统计两种类型的字符个数,需定义两个统计变量,初始值都为0
3、遍历字符串,得到每一个字符
4、判断该字符属于哪种类型,然后对应类型的统计变量+1,判断字母时需要考虑大小写,条件比较复杂,怎样做才能使判断更简单呢?

参考方案

为方便判断并统计,可将字符串中的字符都转为大写或者都转为小写。

训练步骤

1、创建键盘录入Scanner对象,使用nextLine方法接收输入的字符串。

2、为方便后续判断,使用String的toLowerCase方法,将字符串中的字符都转为小写。

3、需定义两个统计变量,初始值都为0

4、遍历字符串,得到每一个字符

5、判断该字符属于哪种类型,然后对应类型的统计变量+1,次数判断英文字母时只需判断小写即可。

参考答案

  1. import java.util.Scanner;
  2. public class Test07 {
  3. public static void main(String[] args) {
  4. //键盘录入一个字符串,用 Scanner 实现
  5. Scanner sc = new Scanner(System.in);
  6. System.out.println("请输入一个字符串:");
  7. String line = sc.nextLine();
  8. // 为方便统计,将字符串中的字母都转为小写
  9. line = line.toLowerCase();
  10. //要统计两种类型的字符个数,需定义两个统计变量,初始值都为0
  11. int letterCount = 0;
  12. int numberCount = 0;
  13. // 遍历字符串,得到每一个字符
  14. for(int i=0; i<line.length(); i++) {
  15. char ch = line.charAt(i);
  16. // 判断该字符属于哪种类型,然后对应类型的统计变量+1
  17. if (ch >= 'a' && ch <= 'z') {
  18. letterCount++;
  19. } else if (ch >= '0' && ch <= '9') {
  20. numberCount++;
  21. }
  22. }
  23. //输出两种类型的字符个数
  24. System.out.println("英文字母:" + letterCount + "个");
  25. System.out.println("数字:" + numberCount + "个");
  26. }
  27. }

题目5(应用)

请定义一个方法用于判断一个字符串是否是对称的字符串,并在主方法中测试方法。例如:”abcba”、”上海自来水来自海上”均为对称字符串。

训练目标

字符串的反转功能,判断是否相等功能

训练提示

1、判断是否对称,方法的返回值是什么类型?参数列表是什么?

2、怎样判断对称呢?如果可以将字符串反转,反转后发现跟原来的字符串完全一样,不就可以判断出来了吗,那么哪个类有字符串的反转功能呢?

参考方案

训练步骤

1、定义方法,返回值类型为boolean,参数列表为String类型的一个参数。

2、将字符串转换为StringBuilder类型,调用StringBuilder的reverse()方法将字符串反转。

3、将反转后的字符串再转回String类型,并与原字符串比较,如果相等,返回true,否则返回false

4、在主方法中,定义一个字符串,调用方法测试结果。

参考答案

  1. public class Test05 {
  2. public static void main(String[] args) {
  3. String str = "上海自来水来自海上";
  4. System.out.println(isSym(str));
  5. }
  6. public static boolean isSym(String str) {
  7. // 为了程序的健壮,如果传递的是空值,返回false
  8. if (str == null) {
  9. return false;
  10. }
  11. // 转换为StringBuilder
  12. StringBuilder sb = new StringBuilder(str);
  13. // 反转,再转成String
  14. String reStr = sb.reverse().toString();
  15. // 比较与原字符串是否相等
  16. // 相等返回true,不相等返回false,正好与equals的返回值一致,直接返回即可。
  17. return reStr.equals(str);
  18. }
  19. }

题目6(应用)

我国的居民身份证号码,由由十七位数字本体码和一位数字校验码组成。请定义方法判断用户输入的身份证号码是否合法,并在主方法中调用方法测试结果。规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。

训练目标

字符串的遍历、判断

训练提示

1、要判断字符串是否符合规则,方法的返回值类型是什么?参数列表是什么?

2、使用String的API,对每种不符合条件的情况作出判断,一旦发现不符合条件就可以结束方法的执行,返回结果了。

3、在主方法中创建键盘录入,调用方法,输入各种数据测试结果。

参考方案

针对每种不符合条件的情况作出判断

训练步骤

1、定义方法,返回值类型为boolean表示是否合法,参数列表为String类型的id,表示要判断的数据。

2、对每种不符合条件的情况作出判断

  1. 2.1、如果字符串长度不是18,返回false
  2. 2.2、如果字符串以数字"0"开头,返回false
  3. 2.3、遍历字符串,获取每一位字符,判断前17位,如果不是数字,返回false,判断最后一位如果不是数字或者X,返回false
  4. 2.4、所以的不符合条件都筛选完成,返回true

3、在主方法中创建键盘录入Scanner对象,调用nextLine()方法,获取用户输入,调用方法,传递参数,查看结果。要多运行几次,判断各种不符合条件的数据。

参考答案

  1. import java.util.Scanner;
  2. public class Test06 {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. System.out.println("请输入身份证号:");
  6. String id = sc.nextLine();
  7. System.out.println(check(id));
  8. }
  9. // 返回值boolean类型,表示是否符合规则。参数列表:需要判断的字符串
  10. public static boolean check(String id) {
  11. // 如果传递了空参数,返回false
  12. if (id == null) {
  13. return false;
  14. }
  15. // 如果是数字0开头,返回false
  16. if (id.startsWith("0")) {
  17. return false;
  18. }
  19. // 如果不是18位,返回false
  20. if (id.length() != 18) {
  21. return false;
  22. }
  23. // 遍历判断每一位
  24. for (int i = 0; i < id.length(); i++) {
  25. char ch = id.charAt(i);
  26. // 前17位都是数字,最后一位可以是数字或者大写字母X
  27. if (i == id.length() - 1) { // 最后一位
  28. if (ch < '0' || ch > '9' && ch != 'X') { // 不是数字或者X
  29. return false;
  30. }
  31. } else { // 其他位
  32. if (ch < '0' || ch > '9') { // 不是数字
  33. return false;
  34. }
  35. }
  36. }
  37. // 所有的规则都符合,返回true
  38. return true;
  39. }
  40. }

题目7(练习)

定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。

要求:

  1. 1、如果传递的参数为空,返回null
  2. 2、如果传递的数组元素个数为0,返回[]
  3. 3、如果数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]

训练目标

字符串的拼接

训练提示

1、定义方法的返回值是什么?参数列表是什么?

2、如果不做判断就对数组进行遍历,那么如果数组对象为空,会报出异常,怎样避免空指针异常呢?

3、拼接字符串必然涉及到频繁改变,该采用可变的字符序列StringBuilder比较好

4、遍历数组,按照题目格式拼接数组中的元素。

5、将字符串返回

6、在主方法中定义数组,并调用方法,打印结果

参考方案

使用StringBuilder拼接字符串

训练步骤

1、定义方法返回值类型:String,参数:int[] arr

2、判断对象如果为null,直接返回null

3、创建StringBuilder对象

4、遍历数组,按照要求进行拼接数组元素,如果是不是最后一个元素,还要拼接逗号和空格

5、将StringBuilder转为String返回

6、在主方法中定义数组,并调用方法,打印结果

参考答案

  1. public class Test07 {
  2. public static void main(String[] args) {
  3. // 定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
  4. int[] arr = {1, 2, 3};
  5. // 调用方法,输出结果
  6. System.out.println(arrayToString(arr));
  7. }
  8. /*定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回
  9. 返回值类型:String
  10. 参数:int[] arr
  11. */
  12. public static String arrayToString(int[] arr) {
  13. // 健壮性判断
  14. if (arr == null) {
  15. return null;
  16. }
  17. //在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
  18. StringBuilder sb = new StringBuilder();
  19. sb.append("[");
  20. for (int i = 0; i < arr.length; i++) {
  21. // 拼接元素
  22. sb.append(arr[i]);
  23. // 如果不是最后一个元素,再拼接逗号和空格
  24. if (i != arr.length - 1) {
  25. sb.append(", ");
  26. }
  27. }
  28. sb.append("]");
  29. return sb.toString();
  30. }
  31. }

题目8(扩展)

在String类的API中,有如下两个方法:

  1. // 查找参数字符串str在调用方法的字符串中第一次出现的索引,如果不存在,返回-1
  2. public int indexOf(String str)
  3. // 截取字符串,从索引beginIndex(包含)开始到字符串的结尾
  4. public String substring(int beginIndex)

请仔细阅读API中这两个方法的解释,完成如下需求。

现有如下文本:”Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的”。请编写程序,统计该文本中”Java”一词出现的次数。

训练目标

String类API的灵活使用

训练提示

1、要找的子串是否存在,如果存在获取其出现的位置。这个可以使用indexOf完成。
2、如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,而剩余字符串的起始位是出现位置再加上子串的长度。

3、以此类推,通过循环完成查找,如果找不到就是-1,每次找到用计数器记录次数。

参考方案

从左至右依次查找,将已查找的部分截取掉。

训练步骤

1、定义方法,返回值int表示次数,参数列表两个字符串,第一个表示在哪个字符串中查找,第二个表示要查找的目标子串

2、定义统计变量表示次数。

3、定义索引变量,表示每次找到子串出现的索引。

4、定义循环,判断条件为在字符串中找到了目标子串,使用indexOf实现。

5、如果找到的索引不是-1,在循环中,统计变量累加。

6、把查找过的部分剪切掉,从找到的索引+子串长度的位置开始截取,使用substring实现。

7、将统计变量返回

8、在主方法中,定义字符串表示题目中的文本,定义字符串表示要查找的子串,调用方法,获取结果。

参考答案

  1. public class Test08 {
  2. public static void main(String[] args) {
  3. String str = "Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的";
  4. String tar = "Java";
  5. // 调用方法并输出
  6. System.out.println(search(str, tar));
  7. }
  8. // 返回值int表示次数,参数列表str表示在哪个字符串中查找,tar表示要查找的目标子串
  9. public static int search(String str, String tar) {
  10. // 定义统计变量表示次数
  11. int count = 0;
  12. // 定义索引变量,表示每次找到子串出现的索引
  13. int index = -1;
  14. // 定义循环,判断条件为在字符串中找到了目标子串
  15. while ((index = str.indexOf(tar)) != -1) { // 将找到的索引赋值给变量并判断
  16. // 次数累加
  17. count++;
  18. // 把查找过的部分剪切掉,从找到的索引+子串长度的位置开始截取。
  19. str = str.substring(index + tar.length());
  20. }
  21. return count;
  22. }
  23. }

ArrayList练习

每日作业 - JavaSE第9天

题目1(训练)

现有如下字符串元素:[“aaa”, “bbb”, “aaa”, “aaa”, “ccc”, “bbb”],请将所有的元素按顺序存入ArrayList集合中,并遍历集合查看存储结果。

训练目标

ArrayList集合存储字符串元素,并遍历。

训练提示

1、创建ArrayList集合,泛型如何定义?

2、怎样将数据添加到集合中?

3、怎样遍历集合?

参考方案

训练步骤

1、创建ArrayList集合对象,泛型声明为String类型

2、调用集合的add方法,将元素依次存入集合

3、遍历集合

  1. 3.1、定义循环,索引从0到集合的size-1
  2. 3.2、通过ArrayList集合的get方法,依次获取索引上的元素

参考答案

  1. public class Test01 {
  2. public static void main(String[] args) {
  3. // 创建集合对象
  4. ArrayList<String> list = new ArrayList<>();
  5. // 添加元素
  6. list.add("aaa");
  7. list.add("bbb");
  8. list.add("aaa");
  9. list.add("aaa");
  10. list.add("ccc");
  11. list.add("bbb");
  12. // 遍历集合
  13. for (int i = 0; i < list.size(); i++) { // 索引从0到size-1
  14. String element = list.get(i); // 根据索引获取元素
  15. System.out.println(element);
  16. }
  17. }
  18. }

题目2(训练)

请定义教师(Teacher)类,属性包含姓名和专业名称。将若干教师对象存入ArrayList集合中,并遍历集合打印教师信息,格式如下:

  1. 姓名:赵老师, 专业:javase
  2. 姓名:钱老师, 专业:javaee
  3. 姓名:孙老师, 专业:php
  4. 姓名:李老师, 专业:python

训练目标

ArrayList集合存储自定义对象,并遍历。

训练提示

1、怎样定义一个描述教师信息的类?

2、需要将教师对象存入集合,创建集合对象,泛型该怎样定义?

3、怎样将数据添加到集合中?

4、怎样遍历ArrayList集合?输出信息时,直接打印对象名称可以吗?怎样才能按照题目要求格式输出信息?

参考方案

训练步骤

1、新建Teacher类,成员变量为String类型的name和course,私有修饰,提供构造方法,提供get和set方法。

2、创建ArrayList集合对象,泛型声明为Teacher类型

3、创建若干Teacher对象,可以使用构造方法为成员变量赋值,调用集合的add方法,将元素依次存入集合。

4、遍历集合

  1. 3.1、定义循环,索引从0到集合的size-1
  2. 3.2、通过ArrayList集合的get方法,依次获取索引上的元素。
  3. 3.3、通过Teacher对象的get方法,获取属性值,拼接成要求的格式输出。

参考答案

  1. public class Teacher {
  2. private String name; // 姓名
  3. private String course; // 课程
  4. public Teacher() {
  5. }
  6. public Teacher(String name, String course) {
  7. this.name = name;
  8. this.course = course;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public String getCourse() {
  17. return course;
  18. }
  19. public void setCourse(String course) {
  20. this.course = course;
  21. }
  22. }
  23. import java.util.ArrayList;
  24. public class Test02 {
  25. public static void main(String[] args) {
  26. // 创建集合对象
  27. ArrayList<Teacher> list = new ArrayList<>();
  28. // 创建教师对象
  29. Teacher t1 = new Teacher("赵老师", "javase");
  30. Teacher t2 = new Teacher("钱老师", "javaee");
  31. Teacher t3 = new Teacher("孙老师", "php");
  32. Teacher t4 = new Teacher("李老师", "python");
  33. // 添加元素
  34. list.add(t1);
  35. list.add(t2);
  36. list.add(t3);
  37. list.add(t4);
  38. // 遍历
  39. for (int i = 0; i < list.size(); i++) {
  40. Teacher t = list.get(i);
  41. System.out.println("姓名:" + t.getName() + ", 专业:" + t.getCourse());
  42. }
  43. }
  44. }

题目3(训练)

有如下员工信息:

  1. 姓名:张三,工资:3000
  2. 姓名:李四,工资:3500
  3. 姓名:王五,工资:4000
  4. 姓名:赵六,工资:4500
  5. 姓名:田七,工资:5000

先需要将所有的员工信息都存入ArrayList集合中,并完成如下操作:

1、判断是否有姓名为“王五”的员工,如果有,改名为“王小五”

2、判断是否有姓名为“赵六”的员工,如果有,将其删除

3、给姓名为“田七”的员工,涨500工资

训练目标

ArrayList集合的修改元素和删除元素API

训练提示

1、需要定义员工类,将员工信息进行封装

2、创建ArrayList集合,创建员工对象,将所有员工对象存入集合

3、需要判断集合中元素的信息,那么肯定需要遍历集合获取到所有元素

4、ArrayList集合中,修改元素和删除元素的方法是什么?在遍历集合时,删除了集合中的元素,会不会对遍历产生影响呢?如果会,该怎么解决?

参考方案

训练步骤

1、定义员工类Worker,私有属性name和salary,分别为String和int类型,表示姓名和工资,提供构造、get、set方法

2、创建ArrayList集合,泛型为Worker类型,创建员工对象,将所有员工对象存入集合

3、使用for循环遍历集合,获取到每一个元素。

  1. 3.1、判断元素的name属性,如果符合条件,作出相应的修改或者删除。
  2. 3.2、遍历时如果删除元素,后面的元素会往前走,索引再加1就会有元素遗漏,所以删除后遍历索引要相应的减1,防止有元素遍历不到。

参考答案

  1. public class Worker {
  2. private String name;
  3. private int salary;
  4. public Worker() {
  5. }
  6. public Worker(String name, int salary) {
  7. this.name = name;
  8. this.salary = salary;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public int getSalary() {
  17. return salary;
  18. }
  19. public void setSalary(int salary) {
  20. this.salary = salary;
  21. }
  22. }
  23. import java.util.ArrayList;
  24. public class Test03 {
  25. public static void main(String[] args) {
  26. // 创建集合对象
  27. ArrayList<Worker> list = new ArrayList<>();
  28. // 创建员工对象并添加到集合中
  29. list.add(new Worker("张三", 2000));
  30. list.add(new Worker("李四", 2500));
  31. list.add(new Worker("王五", 3000));
  32. list.add(new Worker("赵六", 3500));
  33. list.add(new Worker("田七", 4000));
  34. // 判断是否有王五,如果有,改名为王小五
  35. // 判断是否有赵六,如果有,删除赵六
  36. // 给田七加500块工资
  37. for (int i = 0; i < list.size(); i++) {
  38. Worker w = list.get(i);
  39. if ("王五".equals(w.getName())) {
  40. w.setName("王小五");
  41. list.set(i, w);
  42. }
  43. if ("赵六".equals(w.getName())) {
  44. // 注意,一旦删除元素,后面的元素会往前走,索引再加1就会有元素遗漏,所以删除后要--
  45. list.remove(i--);
  46. }
  47. if ("田七".equals(w.getName())) {
  48. w.setSalary(w.getSalary() + 500);
  49. list.set(i, w);
  50. }
  51. }
  52. // 再次遍历查看结果
  53. for (int i = 0; i < list.size(); i++) {
  54. Worker w = list.get(i);
  55. System.out.println(w.getName() + "---" + w.getSalary());
  56. }
  57. }
  58. }

题目4(综合)

利用面向对象的思想设计一个图书管理系统。图书的属性有:编号,书名,作者,价格。要求提供如下功能:

1、提供操作菜单,可以选择要进行的操作。

2、可以添加图书,添加图书时,编号需要唯一,添加成功,返回到菜单。

3、可以查询图书,显示所有图书信息,然后返回到菜单。

4、可以根据书名,查询单本图书信息,显示信息后,返回到菜单。

5、可以删除图书,通过编号删除,删除成功后,返回到菜单。

6、可以修改图书的信息,但编号不可以修改,修改成功后,返回到菜单。

7、可以退出系统,结束程序运行。

提示:

1、所有图书信息由键盘录入

2、图书的价格可以定义为字符串类型,因为在键盘录入时,不可以先使用nextInt()方法获取整数然后再使用nextLine()方法获取字符串,这样会导致nextLine()方法获取不到数据。

训练目标

ArrayList集合API的综合运用、编程逻辑的锻炼

训练提示

1、首先需要创建一个图书类,封装图书信息。

2、提供操作菜单,可以通过键盘录入不同的数字来表示不同的操作,选择结构语句可以实现该需求。

3、管理图书,需要将图书存放起来,首先需要创建集合容器。

4、添加图书,即将图书存入集合中,但存入之前需要判定编号的唯一性,如果编号存在,需要重新录入。

5、查询所有图书,即为遍历集合显示信息。

6、查询单本图书,需要录入图书名称,遍历集合进行查询。

7、修改图书信息,需要根据编号先找到该图书,修改其除了编号之外的信息,存入集合覆盖原来的信息。

8、删除图书信息,需要根据编号先找到该图书,根据索引直接删除即可。

9、退出系统功能,借助结束程序的API实现即可。

参考方案

训练步骤

1、创建Book类,属性String类型的id,name,author,price。提供构造方法、get和set方法。

2、创建测试类Test04,在main方法中,创建键盘录入对象,创建ArrayList集合对象用于存储图书。

3、使用输出语句定义一个操作菜单,包含添加、查看全部、查看单个、修改、查询、退出功能,使用switch语句对键盘录入的菜单项进行判断。

4、定义方法实现判断id是否已经存在。方法返回值boolean类型,参数列表为集合ArrayList和要查找的id字符串。遍历集合,判断id是否与集合中的Book对象的id相同,如果有相同,返回true,否则返回false

5、定义方法实现添加功能。方法返回值void,参数列表为集合ArrayList。在方法中,先使用键盘录入获取用户录入的id信息,调用方法判断id是否存在,如果存在,重新录入,如果不存在,再依次获取图书的其他信息,创建图书对象,并将图书对象存入集合中,输出添加成功的提示。

6、定义方法实现查看所有图书。方法返回值void,参数列表为集合ArrayList。如果集合长度为0,给出提示,结束方法,否则遍历集合,获取每个图书对象,再调用对象的get方法,获取所有信息展示即可。

7、定义方式实现根据名称查看一本图书。方法返回值void,参数列表为集合ArrayList。键盘录入图书的名称,遍历集合,获取每个图书的名称信息进行比较,如果相同,输出该图书信息,结束方法。否则输出不存在该图书。

8、定义方法实现根据编号修改图书信息。方法返回值void,参数列表为集合ArrayList。键盘录入图书编号,查询该编号是否存在,如果存在,再依次录入图书的修改后信息,创建新的图书对象,存入集合,将原对象覆盖,给出成功的提示,否则提示该编号图书不存在。

9、定义方法实现根据编号删除图书信息。方法返回值void,参数列表为集合ArrayList。键盘录入图书编号,查询该编号是否存在,如果存在,根据索引删除该对象,返回成功的提示,否则提示该编号的图书不存在。

10、退出系统的功能直接调用System的exit方法实现即可。

参考答案

  1. public class Book {
  2. private String bookId;
  3. private String name;
  4. private String author;
  5. private String price;
  6. public Book() {
  7. }
  8. public Book(String bookId, String name, String author, String price) {
  9. this.bookId = bookId;
  10. this.name = name;
  11. this.author = author;
  12. this.price = price;
  13. }
  14. public String getBookId() {
  15. return bookId;
  16. }
  17. public void setBookId(String bookId) {
  18. this.bookId = bookId;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public String getAuthor() {
  27. return author;
  28. }
  29. public void setAuthor(String author) {
  30. this.author = author;
  31. }
  32. public String getPrice() {
  33. return price;
  34. }
  35. public void setPrice(String price) {
  36. this.price = price;
  37. }
  38. }
  39. import java.util.ArrayList;
  40. import java.util.Scanner;
  41. public class Test04 {
  42. public static void main(String[] args) {
  43. // 创建集合用于存储图书信息
  44. ArrayList<Book> list = new ArrayList<>();
  45. // 键盘录入
  46. Scanner sc = new Scanner(System.in);
  47. while (true) {
  48. System.out.println("请选择你要进行的操作");
  49. System.out.println("1:添加图书");
  50. System.out.println("2:查看图书");
  51. System.out.println("3:查询图书");
  52. System.out.println("4:修改图书");
  53. System.out.println("5:删除图书");
  54. System.out.println("6:退出系统");
  55. String type = sc.nextLine();
  56. switch (type) {
  57. case "1":
  58. // 添加
  59. addBook(list);
  60. break;
  61. case "2":
  62. // 查看所有图书
  63. findAllBooks(list);
  64. break;
  65. case "3":
  66. // 查询某本图书
  67. findBookByName(list);
  68. break;
  69. case "4":
  70. // 修改图书
  71. updateBook(list);
  72. break;
  73. case "5":
  74. // 删除图书
  75. deleteBook(list);
  76. break;
  77. case "6":
  78. System.out.println("感谢使用,再见");
  79. System.exit(0); // 退出系统
  80. default:
  81. System.out.println("选择有误,请重新输入");
  82. break;
  83. }
  84. }
  85. }
  86. // 删除图书
  87. private static void deleteBook(ArrayList<Book> list) {
  88. Scanner sc = new Scanner(System.in);
  89. System.out.println("请输入您要删除的图书编号:");
  90. String id = sc.nextLine();
  91. for (int i = 0; i < list.size(); i++) {
  92. Book b = list.get(i);
  93. if (id.equals(b.getBookId())) { // 编号存在
  94. // 删除图书并结束方法
  95. list.remove(i);
  96. System.out.println("~~~删除成功~~~");
  97. return;
  98. }
  99. }
  100. System.out.println("没有该编号的图书信息");
  101. }
  102. // 修改图书
  103. private static void updateBook(ArrayList<Book> list) {
  104. Scanner sc = new Scanner(System.in);
  105. System.out.println("请输入您要修改的图书编号:");
  106. String id = sc.nextLine();
  107. for (int i = 0; i < list.size(); i++) {
  108. Book b = list.get(i);
  109. if (id.equals(b.getBookId())) { // 编号存在
  110. System.out.println("请输入修改后图书的名称:");
  111. String name = sc.nextLine();
  112. System.out.println("请输入修改后图书的作者:");
  113. String author = sc.nextLine();
  114. System.out.println("请输入修改后图书的价格:");
  115. String price = sc.nextLine();
  116. Book newBook = new Book(id, name, author, price);
  117. // 更新数据
  118. list.set(i, newBook);
  119. System.out.println("~~~修改成功~~~");
  120. return;
  121. }
  122. }
  123. // 如果编号不存在
  124. System.out.println("没有该编号的图书信息");
  125. }
  126. // 根据图书的名称查询图书信息
  127. private static void findBookByName(ArrayList<Book> list) {
  128. Scanner sc = new Scanner(System.in);
  129. System.out.println("请输入您要查询的图书名称:");
  130. String name = sc.nextLine();
  131. for (int i = 0; i < list.size(); i++) {
  132. Book b = list.get(i);
  133. if (name.equals(b.getName())) {
  134. System.out.println("编号\t" + "书名\t" + "作者\t" + "价格");
  135. System.out.println(b.getBookId() + "\t" + b.getName() + "\t" + b.getAuthor() + "\t" + b.getPrice());
  136. return;
  137. }
  138. }
  139. System.out.println("没有该名称图书信息");
  140. }
  141. // 查看所有图书信息
  142. private static void findAllBooks(ArrayList<Book> list) {
  143. if (list == null || list.size() == 0) {
  144. System.out.println("尚无图书信息");
  145. return;
  146. }
  147. System.out.println("编号\t" + "书名\t" + "作者\t" + "价格");
  148. for (int i = 0; i < list.size(); i++) {
  149. Book b = list.get(i);
  150. System.out.println(b.getBookId() + "\t" + b.getName() + "\t" + b.getAuthor() + "\t" + b.getPrice());
  151. }
  152. }
  153. // 查询编号是否存在
  154. public static boolean isExist(ArrayList<Book> list, String bookId) {
  155. // 遍历,如果发现相同id,返回true,
  156. for (int i = 0; i < list.size(); i++) {
  157. if (bookId.equals(list.get(i).getBookId())) {
  158. return true;
  159. }
  160. }
  161. // 如果没有,返回false
  162. return false;
  163. }
  164. // 添加图书
  165. public static void addBook(ArrayList<Book> list) {
  166. // 键盘录入
  167. Scanner sc = new Scanner(System.in);
  168. System.out.println("请输入图书信息:");
  169. System.out.println("编号:");
  170. String bookId;
  171. while (true) {
  172. bookId = sc.nextLine();
  173. // 查询编号是否存在
  174. if (isExist(list, bookId)) {
  175. System.out.println("该编号已经存在,请重新输入");
  176. } else {
  177. break;
  178. }
  179. }
  180. System.out.println("名称:");
  181. String name = sc.nextLine();
  182. System.out.println("作者:");
  183. String author = sc.nextLine();
  184. System.out.println("价格:");
  185. String price = sc.nextLine();
  186. // 将信息封装到图书对象
  187. Book b = new Book(bookId, name, author, price);
  188. // 添加到集合
  189. list.add(b);
  190. System.out.println("~~~添加成功~~~");
  191. }
  192. }