Java---练习(面试题) :字符串截取(2-最终版)

简介: Java---练习(面试题) :字符串截取(2-最终版)

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

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

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

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


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

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


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


注意:

在上一个中,我把题意理解错了,其实题目要求的只是输出第一个n字节的字串就可以了。

在上一个中我是把一个字符串按照n拆分了。。。。

package io.app;
import java.io.IOException;
import org.junit.Test;
/**
 * 
 * @author 陈浩翔
 *
 * @version 1.0  2016-4-28
 */
public class StringCut {
    public static void main(String[] args) {
        String str = "ab你好a琲琲";
        byte bf[] = str.getBytes();//这里是采用默认编码,可能是GBK,也可能是UTF-8
        for(int i=0;i<=bf.length;i++){
            String res;
            try {
                res = cutString(str,i);
                System.out.println(i+" : "+res);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 根据传入的字符串,来判断是什么编码的,分别导向不同的方法
     * @param str
     * @param len
     * @return
     * @throws IOException 
     */
    private static String cutString(String str, int len) throws IOException {
        //System.getProperty("file.encoding")---获得系统的编码
        if(System.getProperty("file.encoding").equalsIgnoreCase("gbk")){
            return cutStringGbk(str, len);
        }
        if(System.getProperty("file.encoding").equalsIgnoreCase("utf-8")){
            return cutStringUtf8(str, len);
        }
        throw new RuntimeException("不支持当前系统的编码");
    }
    private static String cutStringUtf8(String str, int len) throws IOException {
        byte buf[] = str.getBytes("utf-8");
        int count=0;
        for(int i=len-1;i>=0;i--){
            if(buf[i]<0){
                count++;
            }else{
                break;
            }
        }
        int x = count%3;
        return new String(buf,0,len-x,"utf-8");
    }
    private static String cutStringGbk(String str, int len) throws IOException {
        byte buf[] = str.getBytes("gbk");
        int count=0;
        for(int i=len-1;i>=0;i--){
            if(buf[i]<0){
                count++;
            }else{
                break;
            }
        }
        if(count%2==0){
            return new String(buf,0,len,"gbk");
        }else{
            return new String(buf,0,len-1,"gbk");
        }
    }
    @Test
    /**
     * 可以不需要main方法进行运行单个方法!!!!
     * @throws IOException
     */
    public void analyze() throws IOException {
        //String str ="ab你好";
        String str ="ab你好a琲琲琲";
        //byte buf[] = str.getBytes("gbk");
        byte buf[] = str.getBytes("utf-8");
        for(byte b:buf){
            System.out.print(b+" ");
        }
        System.out.println();
    }
}

GBK下的运行结果:

(汉字为2个字节)

0 : 
1 : a
2 : ab
3 : ab
4 : ab你
5 : ab你
6 : ab你好
7 : ab你好a
8 : ab你好a
9 : ab你好a琲
10 : ab你好a琲
11 : ab你好a琲琲


UTF-8下的运行结果:

(汉字理解为3个字节)


0 : 
1 : a
2 : ab
3 : ab
4 : ab
5 : ab你
6 : ab你
7 : ab你
8 : ab你好
9 : ab你好a
10 : ab你好a
11 : ab你好a
12 : ab你好a琲
13 : ab你好a琲
14 : ab你好a琲
15 : ab你好a琲琲
目录
相关文章
|
9天前
|
Java
Java 字符串分割split空字符串丢失解决方案
Java 字符串分割split空字符串丢失解决方案
|
20天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
38 1
|
10天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
33 0
|
19天前
|
存储 缓存 算法
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
最重要的是保持自信和冷静。提前准备,并对自己的知识和经验有自信,这样您就能在面试中展现出最佳的表现。祝您面试顺利!Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。下是几个面试技巧:复习核心概念、熟悉常见问题、编码实践、项目经验准备、注意优缺点、积极参与互动、准备好问题问对方和知其所以然等,多准备最好轻松能举一反三。
46 0
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
|
20天前
|
Java
java 8 数组转字符串并以逗号分隔
java 8 数组转字符串并以逗号分隔
11 0
|
23天前
|
Java 程序员 API
java1.8常考面试题
在Java 1.8版本中,引入了很多重要的新特性,这些特性常常成为面试的焦点
42 8
|
28天前
|
NoSQL Java 关系型数据库
整理Java面试题
整理Java面试题
|
28天前
|
SQL Java
使用java中的String类操作复杂的字符串
使用java中的String类操作复杂的字符串
9 0
|
28天前
|
Java
使用java将字符串写入到指定的文件中
使用java将字符串写入到指定的文件中
11 0
|
28天前
|
Java 索引
Java字符串
Java字符串
7 0