Java day10

Strinig

对于字符串而言,哈希码值是不会改变的。
因为字符串是被共享的,保证哈希码值一样的情况下,字符串一样,对象一样。

常用API

indexOf() 获取指定元素第一次出现的位置
indexOf(" ",fronIndex) 从指定位置寻找指定元素
lastIndexOf() 获取指定元素最后一次出现的位置
intern() 强制返回这个字符串的字面量
replace(char oldChar, char newChar) 替换
substring(begnIndex) 截取,从指定索引到最后
substring(begnIndex,endIndex) 从开始索引到结束索引,包钱不包后
trim() 去掉两边的空格
valueOf() valueOf底层调用了对象的toString方法
split(" ") 切割
// 边界符如果在字符串的开头,那么会切出一个" “,有几个切几个
// 边界符如果在字符串的中间,那么会切出一个” “,如果有多个边界符,那么会切n-1个” "
// 边界符如果在字符串的后面,那么被直接切掉,无论有多少个

练习

输入一个字符串以及一个子串,打印这个子串在字符串中出现的所有的位置

public static void main(String[] args) {        
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        String subStr = scanner.nextLine();
        // abcdaka
        int index = 0;
        while (index < str.length()){
            index =  str.indexOf(subStr,index);
            if (index != - 1){
                System.out.println(index);
                index++;
            }else{
                break;
            }
        }
    }

// 输入一个字符串和一个数字,数字表示字节的个数,
// 按照指定的字节个数截取字符串(使用GBK编码),并且如果出现乱码就舍弃乱码。

public static void main(String[] args) throws UnsupportedEncodingException {     
        // 获取字符串和字符个数
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        int n = scanner.nextInt();
        // 先将字符串转换为字节数组
        byte[] bs = str.getBytes("gbk");
        // 判断要截取的字节个数是否合法
        if (n < 0 || n > bs.length){
            return;
        }
        // 按照指定的字节个数进行截取
        String sub = new String(bs,0,n,"gbk");
        // 判断是否截取了半个字符
        int index = sub.length() - 1;
        if (sub.charAt(index) != str.charAt(index)){
            sub = new String(bs,0,n-1,"gbk");
        }
        System.out.println(sub);
    }

// 练习:输入一个字符串作为密码:由8-12位组成,由大写字母/小写字母/数字/空格至少出现2种

    private static boolean cheakPassword(String password){
        // 密码的长度是8-12位
        if (!password.matches("[a-zA-Z\\d ]{8,12}")){
            return false;
        }
        // 记录出现的字母的类型
        int count = 0;

        // 判断是否出现了小写字母
        if (password.matches(".*[a-z].*")){
            count++;
        }

        // 判断是否出现了大写字母
        if (password.matches(".*[A-Z].*")){
            count++;
        }

        // 判断是否出现了空格
        if (password.matches(".* .*")){
            count++;
        }

        // 判断是否出现了数字
        if(password.matches(".*\\d.*")){
            count++;
        }
        return count>=2;
    }

// 练习:计算字符串的平均碎片长度 aaabbcaabbcc --> aaa bb c aa bb cc --> 12 / 6 = 2

// 获取碎片的总长度
        String str2 = "aaabbcaabbcc";
        int len = str2.length();

        // 去除叠字之后的长度就是碎片的长度
        double count = str2.replaceAll("(.)\\1+","$1").length();

        // 计算平均碎片长度
        System.out.println(len / count);

正则表达式

// 匹配字符串
// 第一个字符: a/b/c
// 第二个字符: 3/4/6/8
// 第三个字符:o/p/q
System.out.println(str.matches("[abc][3468][opq]"));
每个[ ]表示一个字符

判断由一个小写字母组成的字符串
System.out.println(str.matches("[a-z]"));

// 判断由一个字母组成的字符串
System.out.println(str.matches("[a-zA-Z]"));

// 只要是连续范围,都可以使用
System.out.println(str.matches("[m-x]"));

// 判断数字
System.out.println(str.matches("[0-9]"));

// 判断由一个字符组成的字符串,这个字符不是a/b/c
System.out.println(str.matches("[^abc]"));

// 匹配由3个字符组成的字符串
// 开头是数字,结尾是字母 \\d表示数字
// .通配符 可以表示任意一个字符
System.out.println(str.matches("\\d.[a-zA-Z]"));

// 匹配 .
System.out.println(str.matches("\."));

// 匹配
System.out.println(str.matches("\\"));

// 数量词 +
// ab abb abbb abbbb…
// + 表示之前的字符至少出现1次 >=1
System.out.println(str.matches(“ab+”));
// 匹配由字母开头后续是数字的字符串
System.out.println(str.matches("[a-zA-Z]\d+"));

// 由数字作为头和尾的字符串
// * 表示之前的字符可有可无 >=0
System.out.println(str.matches("\d.*\d"));

// 匹配+ \\+
System.out.println(str.matches("\\+"));

// 匹配* \\*
System.out.println(str.matches("\\*"));

// 匹配一个不超过两位的数字组成的字符串
// ? 表示之前的字符最多出现一次 <= 1
System.out.println(str.matches("\d\d?"));
// * + ? 这三个数量词字符后面只能出现一次
// 总结 + >=1
// * >=0
// ? <=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值