Java---练习(面试题) :字符串截取(1)

简介: Java---练习(面试题) :字符串截取(1)

在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。

但对应的字节数不同,一个汉字占两个字节。

定义一个方法,按照指定的字节数来取子串。

如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃。如果取四个字节就是“ab你”,取五个字节还是“ab你”。


上面给出的是在gbk编码下的截取字符串。

下面我写了个代码,可以在utf-8和gbk编码下都能截取字符串。


注意:utf-8下的绝大多数汉字都是3个字节,所以,为了简化,全部当成了3个字节处理。

package io.string;
import java.io.IOException;
import java.util.Scanner;
public class StringCutOut {
    static final String STR = "汗";
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        // 只考虑GBK和UTF-8
        while (true) {
            if (STR.getBytes().length % 2 == 0) {// GBK
                System.out.println("请输入字符串:(输入'#'结束为结束程序)");
                String str = sc.next();
                if ("#".equals(str)) {
                    return;
                }
                System.out.println("请输入指定字节以用来截取字符串(截取的字符串的字串每个占一行):");
                int n = sc.nextInt();
                int len = 0;
                int m = n;
                while (len < str.length()) {
                    if (str.charAt(len) >= 0 && str.charAt(len) <= 128) {
                        n--;
                        System.out.print(str.charAt(len));
                        if (n <= 0) {
                            n = m;
                            System.out.println();
                        }
                        len++;
                    } else {
                        n -= 2;
                        System.out.print(str.charAt(len));
                        if (n  <= 0) {
                            n = m;
                            System.out.println();
                        }
                        len++;
                    }
                }
                System.out.println();
            } else if (STR.getBytes().length % 2 != 0) {// utf-8
                System.out.println("请输入字符串:(输入'#'结束为结束程序)");
                String str = sc.next();
                if ("#".equals(str)) {
                    return;
                }
                str = new String(str.getBytes("gbk"), "UTF-8");
                //因为我的终端输入默认是gbk的,改了系统的编码还是没用。所以就用这个转码了。。
                //这里肯定是有bug的----留待下次编辑修复
                // System.out.println(str);
                // System.out.println(str.length());
                System.out.println("请输入指定字节以用来截取字符串(截取的字符串的字串每个占一行):");
                int n = sc.nextInt();
                int len = 0;
                int m = n;
                while (len < str.length()) {
                    if (str.charAt(len) >= 0 && str.charAt(len) <= 128) {
                        n--;
                        System.out.print(str.charAt(len));
                        len++;
                        if (n <= 0) {
                            n = m;
                            System.out.println();
                        }
                    } else {
                        if(n-2<=0&&m>=3){
                            n=m;
                            System.out.println();
                            continue;
                        }
                        n -= 3;
                        System.out.print(str.charAt(len));
                        if(n<=0){
                            n=m;
                            System.out.println();
                        }
                        len++;
                    }
                }
            }
            System.out.println();
        }
    }
}

GBK编码下的一个测试结果:


请输入字符串:(输入'#'结束为结束程序)

ab你好
请输入指定字节以用来截取字符串(截取的字符串的字串每个占一行):
4
ab你


UTF-8下的一个测试结果:


请输入字符串:(输入'#'结束为结束程序)

ab你好

请输入指定字节以用来截取字符串(截取的字符串的字串每个占一行):

4
ab


目录
相关文章
|
8月前
|
SQL JSON Java
告别字符串拼接:用Java文本块优雅处理多行字符串
告别字符串拼接:用Java文本块优雅处理多行字符串
559 108
|
11月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
549 1
|
8月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
10月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
624 0
|
10月前
|
SQL JSON Java
告别拼接噩梦:Java文本块让多行字符串更优雅
告别拼接噩梦:Java文本块让多行字符串更优雅
815 82
|
10月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
428 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
8月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
10月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
470 14