Java基础系列32-数组、集合练习

x33g5p2x  于2021-12-18 转载在 其他  
字(6.2k)|赞(0)|评价(0)|浏览(705)

一. 练习1 int数组去重排序

需求:
 分析以下需求,并用代码实现:
  1. 定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的
  2. 利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
  3. 打印新数组中的内容按照以下描述完成类的定义。
  一定要注意:不能改变数组中原来数字的大小顺序

分析:
  只有一种元素,所以使用单例Collection即可

Collection接口 – List(接口,可重复,存取顺序一致) 、 Set(接口,唯一,存取顺序不一致)
    List接口 – ArrayList(实现类,数据结构为数组)、LinkedList(实现类,数据结构为链表)
    Set接口 – HashSet(实现类)

因为不能改变顺序,所以不能用Set接口,所以选择ArrayList或LinkedList

代码:

  1. package Java_study;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. /**
  5. *
  6. * @author 只是甲
  7. * @date 2021-07-14
  8. * @remark 课后基础练习1 int数组去重排序
  9. *
  10. */
  11. public class array_lx1 {
  12. public static void main(String[] args) {
  13. //定义一个数组 其中33 22 出现过2次
  14. int[] arr = {33, 22, 11, 33, 15, 66, 88, 22, 10, 97};
  15. //定义一个ArrayList集合,用于存储去重后的int数组
  16. ArrayList<Integer> arrayList = new ArrayList<>();
  17. //遍历数组 arr.for
  18. for (int i : arr) {
  19. //如果数组中不存在该元素,则加入该集合
  20. if (!arrayList.contains(i)) {
  21. arrayList.add(i);
  22. }
  23. }
  24. //创建新数组,长度等于集合的长度
  25. int[] arrSort = new int[arrayList.size()];
  26. //对新数组元素进行赋值
  27. for (int i = 0; i < arrayList.size(); i++) {
  28. arrSort[i] = arrayList.get(i);
  29. }
  30. System.out.println(Arrays.toString(arrSort));
  31. }
  32. }

测试记录:

  1. [33, 22, 11, 15, 66, 88, 10, 97]

二. 练习2 字符串去重

需求:
键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符

分析:
 只有一种元素,所以使用单例Collection即可

Collection接口 – List(接口,可重复,存取顺序一致) 、 Set(接口,唯一,存取顺序不一致)
  List接口 – ArrayList(实现类,数据结构为数组)、LinkedList(实现类,数据结构为链表)
  Set接口 – HashSet(实现类)

因为仅需要去重,不要求顺序,所以使用HashSet即可自动去重,
 需要使用String.toCharArray将字符串拆解成char类型放入数组
 注意char类型的包装类是Character

代码:

  1. package Java_study;
  2. import java.util.HashSet;
  3. import java.util.Scanner;
  4. /**
  5. *
  6. * @author 只是甲
  7. * @date 2021-07-14
  8. * @remark 课后基础练习2 字符串去重
  9. *
  10. */
  11. public class array_lx2 {
  12. public static void main(String[] args) {
  13. System.out.println("请输入一行字符串:");
  14. Scanner sc = new Scanner(System.in);
  15. //将输入的字符串放入chArr数组(链式编程)
  16. char[] chArr = sc.next().toCharArray();
  17. //创建hashSet集合对象
  18. HashSet<Character> hs = new HashSet<Character>();
  19. //遍历字符数组 将值插入hashSet集合
  20. for (int i = 0; i < chArr.length; i++) {
  21. hs.add(chArr[i]);
  22. }
  23. //输出去重后的字符
  24. System.out.println(hs);
  25. }
  26. }

测试记录:

  1. 请输入一行字符串:
  2. abdekjfiefjfowjiosjfioejfioejfie
  3. [a, b, s, d, e, f, w, i, j, k, o]

三.练习3 生成不重复随机数字

需求:
 产生10个1-20之间的随机数要求随机数不能重复

分析:
 只有一种元素,所以使用单例Collection即可

Collection接口 – List(接口,可重复,存取顺序一致) 、 Set(接口,唯一,存取顺序不一致)
  List接口 – ArrayList(实现类,数据结构为数组)、LinkedList(实现类,数据结构为链表)
  Set接口 – HashSet(实现类)
 nextInt(int x)则会生成一个范围在0~x(不包含X)内的任意正整数
  生成1-20则需要 nextint(20)+1
 不能重复的数,则放入HashSet集合即可

代码:

  1. package Java_study;
  2. import java.util.HashSet;
  3. import java.util.Random;
  4. /**
  5. *
  6. * @author 只是甲
  7. * @date 2021-07-14
  8. * @remark 课后基础练习3 生成不重复随机数字
  9. *
  10. */
  11. public class array_lx3 {
  12. public static void main(String[] args) {
  13. HashSet<Integer> hs = new HashSet<>();
  14. Random r = new Random();
  15. //hs小于10个元素则一直声称随机数插入hs集合
  16. while (hs.size() < 10) {
  17. hs.add(r.nextInt(20) + 1);
  18. }
  19. //打印结果
  20. System.out.println("hs.size():" + hs.size());
  21. System.out.println("hs:" + hs);
  22. }
  23. }

测试记录:

  1. hs.size():10
  2. hs:[17, 18, 20, 4, 6, 8, 9, 10, 12, 14]

四. 练习4 生成不重复随机字符串

需求:
  产生10个长度为10的不能重复的字符串(里面只能出现大写字母、小写字母、0-9的数字),并遍历打印输出

分析:
  需要先创建一个字符库,包含所有符合规范的字符 a-z A-Z 0-9,再从这个库中随机取出10个值拼接成为字符串

代码:

  1. package Java_study;
  2. import java.util.Random;
  3. /**
  4. *
  5. * @author 只是甲
  6. * @date 2021-07-14
  7. * @remark 生成不重复随机字符串
  8. *
  9. */
  10. public class array_lx4 {
  11. public static void main(String[] args) {
  12. Random r = new Random();
  13. String charList = "qwertyuiopasdfghjklzxcvvbnmQWERTYUIOPASDFGHJKLZXCVVBNM1234567890";
  14. StringBuilder result = new StringBuilder();
  15. for (int i = 0; i < 10; i++) {
  16. //每次从charList随机取出一个字符拼接到result字符串(随机数字大小等于字符库长度)
  17. result.append(charList.charAt(r.nextInt(charList.length())));
  18. }
  19. //打印结果
  20. System.out.println(result);
  21. }
  22. }

测试记录:

  1. sqMfoFbQZz

五. 练习5 统计字符出现次数

需求:

  1. 利用键盘录入,输入一个字符串
  2. 统计该字符串中各个字符的数量(提示:字符不用排序)
  3. 如:
    用户输入字符串"If~you-want~to~change-your_fate_I_think~you~must~come-to-the-dark-horse-to-learn-java"
    程序输出结果:-(9)I(2)_(3)a(7)c(2)d(1)e(6)f(2)g(1)h(4)i(1)j(1)k(2)l(1)m(2)n(4)o(8)r(4)s(2)t(8)u(4)v(1)w(1)y(3)~(6)

字符 — 次数

思路:

  1. 创建map集合,键为Character,值为Integer
  2. 键盘录入字符串 str
  3. 将字符串转换为字符数组,并遍历这个字符数组,获取每个字符
  4. 在循环中判断集合中map集合中的键是否包含这个字符,如果map集合中的键不包含这个字符,那么就让map执行put方法,键就是遍历到的字符,值为1
    如果map集合中包含这个键,就让map集合的值 + 1存储
  5. 循环完毕后,遍历map集合进行打印,打印过程中按照指定格式来进行。

代码:

  1. package Java_study;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Scanner;
  5. import java.util.Set;
  6. /**
  7. *
  8. * @author 只是甲
  9. * @date 2021-07-14
  10. * @remark 课后基础练习5 统计字符出现次数
  11. *
  12. */
  13. public class array_lx5 {
  14. public static void main(String[] args) {
  15. Scanner sc = new Scanner(System.in);
  16. //(k,v):<字符,出现字数>
  17. HashMap<Character, Integer> hm = new HashMap<>();
  18. System.out.println("请输入一个字符串");
  19. String str = sc.next();
  20. char[] chs = str.toCharArray();
  21. for (char ch : chs) {
  22. //如果已包含这个key 则value加1后重新放入map,如果不包含,则放入该字符,并给value值为1
  23. hm.put(ch, hm.containsKey(ch) ? hm.get(ch) + 1 : 1);
  24. }
  25. Set<Map.Entry<Character, Integer>> esSet = hm.entrySet();
  26. for (Map.Entry<Character, Integer> me : esSet) {
  27. //HashMap存取顺序随机,不一致
  28. //I(2) _(3) a(7) c(2) d(1) e(6) f(2) g(1) h(4) i(1) j(1) k(2) l(1) -(9) m(2) n(4) o(8) r(4) s(2) t(8) u(4) v(1) w(1) y(3) ~(6)
  29. System.out.println(me.getKey() + "(" + me.getValue() + ")");
  30. }
  31. }
  32. }

测试记录:

  1. 请输入一个字符串
  2. wojfioejfiowefjwofjwiofajeifojwefiojcmoaj99weijowfijef123r3fwf311232445354546242343243
  3. a(2)
  4. c(1)
  5. e(6)
  6. f(11)
  7. i(7)
  8. j(10)
  9. m(1)
  10. o(9)
  11. 1(3)
  12. 2(6)
  13. r(1)
  14. 3(8)
  15. 4(7)
  16. 5(3)
  17. 6(1)
  18. w(8)
  19. 9(2)

六. 练习6 分割字符串并计数

需求:

  1. 统计每个单词出现的次数
  2. 有如下字符串"If you want to change your fate I think you must come to the dark horse to learn java"(用空格间隔)
  3. 打印结果:

分析:

  1. 分割字符串 => String.split
  2. 分割后的字符串放入String[]数组
  3. 将字符串,数量放入Map中(k,v) k=字符串 v=字符串出现次数
  4. 遍历String[]放入map,每次放入前判断是否存在该字符串
    存在则出现次数记为现有值+1
    不存在则出现次数记为1
  5. 遍历map并打印结果

代码:

  1. package Java_study;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. /**
  6. *
  7. * @author 只是甲
  8. * @date 2021-07-14
  9. * @remark 课后基础练习6 分割字符串并计数
  10. *
  11. */
  12. public class array_lx6 {
  13. public static void main(String[] args) {
  14. String s = "If you want to change your fate I think you must come to the dark horse to learn java";
  15. String[] splitStr = s.split(" ");
  16. HashMap<String, Integer> hm = new HashMap<>();
  17. for (String str : splitStr) {
  18. hm.put(str, hm.containsKey(str) ? hm.get(str) + 1 : 1);
  19. }
  20. //遍历hm集合
  21. Set<Map.Entry<String, Integer>> esSet = hm.entrySet();
  22. //将遍历结果进行拼接
  23. StringBuilder sb = new StringBuilder("{");
  24. //拼接时计数
  25. int count = 0;
  26. for (Map.Entry<String, Integer> me : esSet) {
  27. // 每5个元素换行一次
  28. if (count >= 5) {
  29. sb.append("\r\n");
  30. count = 0;
  31. }
  32. count++;
  33. //拼接当前(k,v)值
  34. sb.append("[" + me.getKey() + " = " + me.getValue() + "]、");
  35. }
  36. //去掉最后一个多余的顿号
  37. String temp = sb.substring(0, sb.length() -1).toString();
  38. sb.delete(0, sb.length()).append(temp).append("}");
  39. System.out.println(sb);
  40. }
  41. }

测试记录:

  1. {[think = 1]、[fate = 1]、[learn = 1]、[want = 1]、[change = 1]、
  2. [I = 1]、[come = 1]、[your = 1]、[the = 1]、[horse = 1]、
  3. [java = 1]、[dark = 1]、[must = 1]、[to = 3]、[If = 1]、
  4. [you = 2]}

参考:

  1. https://blog.csdn.net/qq_43529621/article/details/116042907

相关文章