怎样截取字符串?
1.题述:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”, 输入“我ABC汉DEF”6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
2.测试结果:
请输入字符串:
我ABC汉DEFNI你好啊abcde你好啊啊sbsd
请输入字节数:
6
以每6字节划分的字符串如下所示:
我ABC
汉DEFN
I你好
啊abcd
e你好
啊啊sb
sd
subStrList[0]:我ABC
subStrList[1]:汉DEFN
subStrList[2]:I你好
subStrList[3]:啊abcd
subStrList[4]:e你好
subStrList[5]:啊啊sb
subStrList[6]:sd
2.Java代码
package com.example.demo.interviewQuestions;
import java.util.ArrayList;
import java.util.Scanner;
import org.assertj.core.util.Lists;
/**
* @Description 截取字符串
* @author 大都督
* @date 2018年12月28日
*/
public class StringQuestion {
/**
* 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
* 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,
* 输入“我ABC汉DEF”6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
*/
//要进行截取操作的字符串
static String ss;
//截取的字符串的字节数
static int n;
@SuppressWarnings("resource")
public static void main(String[] args) {
System.out.println("请输入字符串:");
//从键盘获取字符串
Scanner scStr = new Scanner(System.in);
//将Scanner对象中的内容以字符串的形式取出来
ss = scStr.next();
System.out.println("请输入字节数:");
//从键盘获取字符串
Scanner scByte = new Scanner(System.in);
//将Scanner对象中的内容以数值的形式取出来
n = scByte.nextInt();
//方法与方法间的套用
ArrayList<String> subStrList = getSubStrList(str2Arr());
if (subStrList != null && subStrList.size() > 0) {
for (int i=0; i<subStrList.size(); i++) {
System.out.println();
System.out.print("subStrList["+i+"]:"+subStrList.get(i));
}
}
}
/**
*
* @Title: getSubStrList
* @Description:根据字符数组,返回指定字节数的子字符串集合
* @param arr
* @return
* @author 大都督
* @date 2018年12月28日
* @return ArrayList<String>
*/
private static ArrayList<String> getSubStrList(String[] arr) {
ArrayList<String> arrayList = Lists.newArrayList();
String str = "";
int count = 0;
//汉字的正则表达式
String m = "[\u4e00-\u9fa5]";
System.out.println("以每"+n+"字节划分的字符串如下所示:");
for (int i=0; i<arr.length; i++) {
//如果是汉字
boolean matches = arr[i].matches(m);
if (matches) {
count = count+2;
}else {
count = count+1;
}
//如果count小于n,则输出当前字符
if (count < n) {
System.out.print(arr[i]);
str += arr[i];
if (i == (arr.length-1)) {
arrayList.add(str);
}
}else if (count == n && !matches) {
System.out.print(arr[i]);
str += arr[i];
arrayList.add(str);
count = 0;
str = "";
//换行,控制打印格式
System.out.println();
}else if (count == n && matches){
System.out.println();
System.out.print(arr[i]);
str += arr[i];
arrayList.add(str);
count = 0;
str = "";
}else if (count > n && matches) {//我ABC汉DEF 我ABC汉DEFNI你好啊abcd
System.out.println();
System.out.print(arr[i]);
arrayList.add(str);
count = 2;
str = arr[i];
}else {
arrayList.add(str);
System.out.println();
count = 0;
str = "";
}
}
return arrayList;
}
/**
*
* @Title: str2Arr
* @Description:将字符串转换成字符串数组
* @return
* @author 大都督
* @date 2018年12月28日
* @return String[]
*/
private static String[] str2Arr() {
//创建一个字符数组
String[] arr = new String[ss.length()];
for (int i=0; i<arr.length; i++) {
//将字符串ss中的第i个字符取出,放入字符数组中string中
arr[i] = ss.substring(i, i+1);
}
return arr;
}
}