黑马程序员技术交流社区
标题:
基础测试题
[打印本页]
作者:
箬竹小筑
时间:
2014-2-9 17:22
标题:
基础测试题
编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
作者:
箬竹小筑
时间:
2014-2-9 17:23
这个题目,看了其他人的编写方式,不能理解,求助
作者:
山治0712
时间:
2014-2-9 17:34
主要是中国汉字的编码 组成汉字的两个编码都是负数
作者:
itpower
时间:
2014-2-9 18:00
package com.itheima;
import java.io.UnsupportedEncodingException;
/*
* 10、 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
* 如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
*/
public class Test10 {
public static void main(String args[]) {
String str = "HM程序员";
int len = 2;
byteSubStr(str, len);
}
public static void byteSubStr(String str, int len) {
String s = null; // 初始化字符串s,赋值为空
// 传入的字符串不能为空
if (str != null) {
byte[] a = null; // 初始化字节数组,赋值为空
try {
a = str.getBytes("GBK"); // 将字符串转化为字节数组,GBK码表,此时字节数组的长度为14
} catch (UnsupportedEncodingException e) { // 捕捉编码失败异常
e.printStackTrace();
}
// System.out.println("String length:"+a.length);打印字节数组的长度
if (a.length <= len) {
s = str; // 如果要求取出的字节长度大于字节数组应有长度,则将s初始化为str
} else if (len > 0) {
s = new String(a, 0, len); // 如果字节长度在字节数组长度范围内,则根据要求取出长度len,创建新的字符串s。
int length = s.length(); // 获取新字符串的长度
// System.out.println(s.length());
if (str.charAt(length - 1) != s.charAt(length - 1)) {// 如果原字符串中相应位置上的字符与
// 新字符串相应位置上的字符不相等,说明新字符串中相应位置只有半个中文,则应该讲数组指针向左移一位,形成新的子串。
if (length < 2) {
s = null; // 如果新字符串的长度小于2,则将新字符串赋值为空。
} else {
s = s.substring(0, length - 1); // 将符合条件的子串复制给s
}
}
}
}
System.out.println(s);
}
}
复制代码
作者:
周昭民
时间:
2014-2-9 18:38
public class Test2
{
public static void splitIt(String str, int byteNum)
{
byte bt[] = str.getBytes(); //将字符串以字节数组形式存储
//字符串中的中文以两个字节元素的形式存在(该数据为负),字母以一个字节元素的形式存在(该数据为正)
/* 如果你不懂,可以去掉注释遍历一下该数组
for(int i=0;i<bt.length;i++){
System.out.println("bt["+i+"]="+bt[i]);
}
*/
if (byteNum >= 1 ) //判断切割位置
{
if (bt[byteNum] < 0 ) //当要切开的位置数据为负数,说明要打印的这个数为中文
{ //则--byteNum,不要打印该字
String substrx = new String(bt, 0 , -- byteNum);
System.out.println(substrx);
} else //否则为正,即最后一个打印的数据为字母,打印
{
String substrex = new String(bt, 0 ,byteNum);
System.out.println(substrex);
}
} else
{
System.out.println( " 输入错误!!!请输入大于零的整数: " );
}
}
public static void main(String args[])
{
String str = "HM程j序员" ;
int num = 6 ;
splitIt(str,num);
}
}
复制代码
我看了一下网上的代码,改了一下,你有什么不懂的再问我
作者:
唐宋元明清
时间:
2014-2-9 22:27
。。这题的关键问题是如何判断是字母还是汉字。
我的思路是:
一个字符串,在某个字节之前都是可用字符,就只判断在这个字节上的字符是不是可用字符就可以了。
首先取出一个字符,看看你要截取的字节中可以包含这个字符么?
包含就把这个字符放进容器中存储,然后把要截取的字节数减去已经放进容器里的字符的字节数。然后再取下一个字符。
不包含说明,当前要取的这个字符不是1个字节,不是1个字节那就是2个字节呗,所以当前这个字符就不用存储进容器中。
在循环外面打印容器里的字符串就可以了。以下是我写的,请参考:
class GetSubStr{
GetSubStr(String s,int count){
if(s!=null && !("".equals(s))){
if (count>0 && count<=s.getBytes().length){
getSubString(s,count);
}
else throw new RuntimeException("字节数输入错误!");
}
else throw new RuntimeException("字符串输入错误!");
}
public void getSubString(String s,int count) {
int i=0;
StringBuffer sb=new StringBuffer();
sb.append("截取"+count+"个字节::");
while(i<s.length()){
Character ch=s.charAt(i++);
count=count-ch.toString().getBytes().length;
if(count>=0){
sb.append(ch);
}
else break;
}
System.out.println(sb.toString());
}
public static void main(String[] args){
for(int i=1;i<=8;i++)
{new GetSubStr("HM程序员",i);}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2