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
你
好

今天就先到这里了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的: 练习使用Java基本数据类型。使用Java的String类操作字符串和子串。 实验内容: 1.写一个程序提示用户键入某一货币数量(以分为单位),该程序应计算出如何用最少量的1元,50分,10分和1分硬币得到该数目。如195分最少可以用一个1元硬币,1个50分硬币,4个10分硬币和5个1分硬币组成。 注意不要用数组存放不同硬币的值。 2.写一个程序可以对两个字符串进行测试,得知第一个字符串是否包含在第二个字符串中。如字符串”PEN”包含在字符串“INDEPENDENT”中。 可以利用字符串方法 boolean regionMatches(int toffset, String other, int ooffset, int len) toffset 指从被调用方法字符串的第几个字符开始测试,如果是0,表明从字符串的首字符开始。other是指使用的另一个字符串。ooffset指从另一个字符串的第几个字符开始。len指要比较几个字符。该方法返回boolean值。 在本题中,ooffset为0,因为我们要测试整个短字符串;len是短字符串的长度;所以应该用 big.regionMatches(index, small, 0, small.length()) 如果big指“independent",small指"pen",则index=2时为假,index=4时为真 (b)改进程序,当第一个字符串包含在第二个字符串中时,显示第一个字符串在第二个字符串中的起始位置。 (c)改进程序,即使当用户输入顺序错误时(第一个是长字符串,第二个是短字符串),能自动在长字符串中搜寻短字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值