Java第八天(实训学习整理资料(七)练习题)

练习:


1、输入一个字符串和一个数字,数字表示字节个数,然后按照指定的字节个数来截取这个字符串,要求不准出现半个字符的现象
2、输入一个字符串,提取这个字符串中的数字并求和 -> sdf85dfghd72s6 -> 8 5 7 2 6 -> 28
3、输入一个字符串,提取这个字符串中的数字并排序->sdf85dfghd72s6 -> 8 5 7 2 6 -> 2 5 6 7 8
4、输入一个字符串,利用charAt方法判断这个字符串是否是一个回文字符串
5、输入一个字符串,统计每个字符出现的个数---hsoafngifaoa -> h:1 s:1 o:2 a:3 f:2 n:1 g:2 i:1

package day1031;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



public class Demo02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int num;
        do {
            System.out.println("请输入要执行的序号:" + "\n" + "\t" + "1:截取字符串" + "\n" + "\t" + "2:提取数字并求和" + "\n" + "\t" + "3:提取数字并排序 " + "\n" + "\t" + "4:回文字符串 " + "\n" + "\t" + "5:统计出现次数 " + "\n" + "\t" + "6:退出 ");
            num = sc.nextInt();
            switch (num) {
                case 6:
                    System.out.println("已退出!");
                    break;
                case 1:

                    /**
                     * 截取字符串
                     */

                    Scanner scanner = new Scanner(System.in);
                    System.out.println("请输入一个字符串:");
                    String inputString = scanner.nextLine();
                    System.out.println("请输入字节数(整数):");
                    int byteCount = scanner.nextInt();

                    // 确保字节数不超过字符串长度,并转换为字符数,因为一个UTF-8字符通常占用1到4个字节
                    double charCount = Math.min(byteCount * 1.25, inputString.length());

                    // 如果字节数不足以构成一个完整字符,那么返回字符串而不是截断结果
                    if (charCount == 0 || charCount % 1 != 0) {
                        System.out.println("由于字节限制,可能现已出现半个字符的情况。请重新输入一个完整的字符数。");
                        return;
                    }

                    // 截取字符串
                    String cutstring = inputString.substring(0, (int) charCount);
                    // 打印输出按要求截取的字符串
                    System.out.println("按照指定字节数截取的字符串是: " + cutstring);
                    break;
                case 2:

                    /**
                     * 提取数字并求和
                     */

                    Scanner s = new Scanner(System.in);
                    System.out.println("请输入一个包含数字的字符串:");
                    String input = s.nextLine();

                    // 正则表达式匹配所有的数字
                    Pattern pattern = Pattern.compile("\\d()+");
                    Matcher matcher = pattern.matcher(input);
                    // 定义一个sum来存储符合条件的数字
                    int sum = 0;
                    while (matcher.find()) {
                        // 将找到的数字添加到总和中
                        sum += Integer.parseInt(matcher.group());
                    }
                    // 打印输出满足条件的数字之和
                    System.out.println("字符串中的数字之和是: " + sum);


                    break;

                case 3:

                    /**
                     *提取数字并排序
                     */

                    Scanner scan = new Scanner(System.in);
                    System.out.println("请输入一个包含数字的字符串:");
                    String input1 = scan.nextLine();
                    // extractAndSortNumbers:提取和排序数字
                    // 将键盘录入的信息传进下面定义的extractAndSortNumbers方法进行判断,并存入名为numbers的int数组中
                    int[] numbers = extractAndSortNumbers(input1);
                    // 打印输出名为numbers的这个数组
                    System.out.println(Arrays.toString(numbers));
                    break;

                case 4:

                    /**
                     * 回文字符串
                     */
                    Scanner scann = new Scanner(System.in);
                    System.out.println("请输入一个回文的字符串进行测试:");
                    String input2 = scann.nextLine();
                    // isPalindrome表示:判断一个字符串是否为回文字符串
                    // 将键盘录入的信息传进下面定义isPalindrome的方法进行判断,并用名为isPalindrome的布尔类型返回值
                    boolean isPalindrome = isPalindrome(input2);
                    // 打印输出名
                    System.out.println(isPalindrome);


                    break;

                case 5:

                    /**
                     * 统计出现次数
                     */

                    Scanner scanne = new Scanner(System.in);
                    System.out.println("请输入一个字符串进行测试:");
                    String input3 = scanne.nextLine();

                    // countCharFrequency表示:计算字符频率
                    // HashMap<Character, Integer>方法表示:可以用于存储字符到其他类型值的映射,例如统计字符出现的频率、构建字符到其对应信息的映射等
                    // 这里可以用来表示统计字符串中每个字符出现的次数‌
                    HashMap<Character, Integer> charFrequency = countCharFrequency(input3);
                    System.out.println("每个字符出现的次数如下:");
                    // 使用foreach语句遍历并打印
                    for (Character ch : charFrequency.keySet()) {
                        System.out.println(ch + ": " + charFrequency.get(ch));
                    }

                    break;
                default:
                    System.out.println("输入无效,请重新输入一个正确的序号!");
                    break;
            }
        } while (num != 6);
    }



    /**
     * 提取数字并排序
     * @param input
     * @return
     */
    public static int[] extractAndSortNumbers(String input) {
        // 用正则表达式提取出数字
        Pattern pattern = Pattern.compile("\\d()+");
        Matcher matcher = pattern.matcher(input);
        // 创建一个以numberList为名的ArrayList对象,用来存储Integer类型的元素
        ArrayList<Integer> numbersList = new ArrayList<>();
        // 调用Java中的Matcher类下面的matcher.find查找匹配子序列并返回布尔值方法进行循环查找
        while (matcher.find()) {
            // matcher.group()方法表示:在Java正则表达式中用于获取与正则表达式匹配的文本。
            // Integer.parseInt()方法表示:将字符串转换为整数
            // numbersList.add()方法表示:添加元素
            numbersList.add(Integer.parseInt(matcher.group()));
        }
        // 创建一个名为numbers的int数组用来存储获取的元素数量
        // numbersList.size()方法表示:获取List中当前存在的元素数量‌。它始终返回当前存在的元素数量,无论列表中是否包含重复元素或空值。
        int[] numbers = new int[numbersList.size()];
        for (int i = 0; i < numbersList.size(); i++) {
            // numbersList.get()方法表示:是Java中List接口的一个方法,用于获取列表中指定索引位置的元素。
            numbers[i] = numbersList.get(i);
        }
        // Arrays.sort方法表示:对数组进行排序,它可以对数组中的元素进行排序,默认情况下是按照从小到大的顺序进行排序。
        Arrays.sort(numbers);
        return numbers;
    }

    /**
     * 回文字符串
     * @param s
     * @return
     */
        public static boolean isPalindrome(String s) {
            // 定义开始和结束
            int start = 0;
            int end = s.length() - 1;
            // 用while循环判断
            while (start < end) {
                // 开头和结尾不相同则不是回文字符串
                if (s.charAt(start) != s.charAt(end)) {
                    return false;
                }
                start++;
                end--;
            }
            return true;
        }

    /**
     * 统计出现次数
     * @param input
     * @return
     */
    public static HashMap<Character, Integer> countCharFrequency(String input) {
        // 定义一个名为frequencyMap的空的哈希映射(HashMap),键是字符型Character,值是整数类型Integer,
        // 用来存放字符及其对应的出现次数
        HashMap<Character, Integer> frequencyMap = new HashMap<>();
        // 使用for-each循环遍历输入字符串的所有字符,将其转换成字符数组
        for (char ch : input.toCharArray()) {
            // 对于数组中的每一个字符(ch),从frequencyMap方法中获取该字符当前的计数值(默认为0,如果该字符未存在于映射中)则当前计数值+1
            frequencyMap.put(ch, frequencyMap.getOrDefault(ch, 0) + 1);
        }
        // 遍历结束后返回包含所有字符频率信息的frequencyMap
        return frequencyMap;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值