A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 血色@残阳 中级黑马   /  2015-2-14 23:23  /  3928 人查看  /  34 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

题目:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
                  例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,
                截取3个字节也要是"HM"而不要出现半个中文

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 赞一个!

查看全部评分

34 个回复

倒序浏览
  1. package com.itheima;
  2. import java.io.IOException;
  3. /**
  4. *第十题: 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
  5.                   例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,
  6.                 截取3个字节也要是"HM"而不要出现半个中文
  7. * @author Administrator
  8. */
  9. public class Test10
  10. {
  11.         public static void main(String[] args) throws IOException
  12.         {
  13.                 String s = "HM程序员";
  14.                 System.out.println("原始字符串:" + s);
  15.                 System.out.println("截取1个字节:"+subStr(s,1));
  16.                 System.out.println("截取2个字节:"+subStr(s,2));
  17.                 System.out.println("截取3个字节:"+subStr(s,3));
  18.                 System.out.println("截取4个字节:"+subStr(s,4));
  19.         }
  20.         public static String subStr(String str, int len) throws IOException  
  21.     {
  22.                 if (str == null && "".equals(str))
  23.                 {  
  24.                         System.out.println("请不要输入空串!");  
  25.                         return str;  
  26.                 }     
  27.                 else
  28.                 {
  29.                         int num = len;//截取字节数
  30.                         //定义变量src,接收截取的子串
  31.                         String src = str.substring(0, len>str.length() ? str.length() : len);
  32.                         //定义变量bys,接收截取的子串src的字节长度
  33.                         int bys = src.getBytes("GBK").length;
  34.                         //说明截取的字符串中包含有汉字  
  35.                         while (bys > num)
  36.                         {  
  37.                                 int cutLen = --len;
  38.                                 src = str.substring(0, cutLen>str.length() ? str.length() : cutLen);  
  39.                                 bys = src.getBytes("GBK").length;
  40.                         }  
  41.                         return src;
  42.                 }
  43.     }
  44. }

复制代码
之前在网上看到了关于这题的一些代码,基本上都是有很大问题的,反正我是没有找到完全正确的代码的,后来我也是参见了一些别人的原理,写了这个代码,应该是没有什么问题了
代码:

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
  1. package com.itheima;

  2. import java.io.*;

  3. /**
  4. * 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
  5. * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  6. * @author frank
  7. */

  8. public class Test10 {
  9.         public static void main(String[] args) throws IOException
  10.         {
  11.                 String str="HM程序员";//定义一个字符串
  12.                 int count=0; //记录要截取的字节数
  13.                 System.out.print("请输入要截取的字节数:");
  14.                
  15.                 //从键盘输入所要截取的字节数
  16.                 BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
  17.                 count=Integer.parseInt(buf.readLine());//将输入的字符串转换成十进制整数,并用count记录
  18.                 System.out.println(splitString(str,count));        //调用截取字符串函数,并输出结果
  19.         }
  20.        
  21.         //截取字符串函数   str:字符串   count:要截取的字节数
  22.         public static String splitString(String str,int count) throws UnsupportedEncodingException
  23.         {
  24.                 byte[] bytes=null;//定义字节数组,初始为null
  25.                 //用gbk对str进行编码,并将结果存储到bytes数组中
  26.                 bytes=str.getBytes("gbk");
  27.                
  28.                 //判断输入要截取的字节数是否为正整数
  29.                 if(count<0)
  30.                         throw new RuntimeException("非法,截取字节数为负!");
  31.                 //判断输入要截取的字节数是否大于原字符串所对应的字节数组的长度
  32.                 else if(count>bytes.length)
  33.                         return str; //若大于,则直接返回原字符串
  34.                 //判断输入要截取的字节数是否>0且为奇数
  35.                 else if(count>0&&count%2==1)
  36.                 {
  37.                         //如果是奇数,就在判断要获取的最后一个字节是不是汉字的一半,通过负数判断,因为汉字的gbk编码值<0
  38.                         if(bytes[count-1]<0)
  39.                                 count--;  //是汉字,则减1
  40.                 }

  41.                 byte[] newBytes=new byte[count]; //定义一个大小为count的新字节数组
  42.                 for(int i=0;i<count;i++)
  43.                         newBytes[i]=bytes[i]; //将bytes数组中的值赋给新字节数组
  44.                 //将新字节数组中的值转换成字符串
  45.                 String newString=new String(newBytes);
  46.                 return newString;

  47.         }
  48. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
楼主的判断空字符串倒是提醒我了几种异常情况, 楼上的明显把程序写死了,只适合例子给的"HM程序员"
回复 使用道具 举报

你这个代码我在网上看到了好些,这种涉及奇偶位的基本是错误的,因为你写的是个函数,你根本不可能确定给出的是什么样的字符串,更何谈奇偶位数了,你把测试字符串换一下就不行了
回复 使用道具 举报
赞一个。。。。。            
回复 使用道具 举报
有模板了,哈哈哈,感谢楼主,等我学到这一块好好看看,测试题好好参考下。
回复 使用道具 举报
huangchunwei 来自手机 中级黑马 2015-2-15 23:25:05
8#
来学习学习。。
回复 使用道具 举报
xyf19881010 来自手机 中级黑马 2015-2-15 23:53:32
9#
楼主的才是正解,赞一个
回复 使用道具 举报
本帖最后由 franksight 于 2015-2-16 00:55 编辑
血色@残阳 发表于 2015-2-15 17:12
你这个代码我在网上看到了好些,这种涉及奇偶位的基本是错误的,因为你写的是个函数,你根本不可能确定给 ...
我仔细看看。。。
回复 使用道具 举报
血色@残阳 发表于 2015-2-15 17:12
你这个代码我在网上看到了好些,这种涉及奇偶位的基本是错误的,因为你写的是个函数,你根本不可能确定给 ...

我之前是考虑过奇偶问题的,我测试了好几个,用的字符串有问题啊啊。。。。。:funk:
回复 使用道具 举报
本帖最后由 franksight 于 2015-2-16 10:28 编辑

我修改了原来代码的38-43行代码,总算是测试了别的特殊情况,现在总算没问题了吧!!!
回复 使用道具 举报
本帖最后由 franksight 于 2015-2-16 10:31 编辑
  1. import java.io.*;

  2. /**
  3. * 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
  4. * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  5. * @author frank
  6. */

  7. public class Test10 {
  8.         public static void main(String[] args) throws IOException
  9.         {
  10.                 System.out.print("请输入字符串:");
  11.                 BufferedReader bufStr=new BufferedReader(new InputStreamReader(System.in));
  12.                 String str=bufStr.readLine();
  13.                 int count=0; //记录要截取的字节数
  14.                 System.out.print("请输入要截取的字节数:");
  15.                
  16.                 //从键盘输入所要截取的字节数
  17.                 BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
  18.                 count=Integer.parseInt(buf.readLine());//将输入的字符串转换成十进制整数,并用count记录
  19.                 System.out.println(splitString(str,count));        //调用截取字符串函数,并输出结果
  20.         }
  21.         
  22.         //截取字符串函数   str:字符串   count:要截取的字节数
  23.         public static String splitString(String str,int count) throws UnsupportedEncodingException
  24.         {
  25.                 byte[] bytes=null;/
  26.                 //用gbk对str进行编码,并将结果存储到bytes数组中
  27.                 bytes=str.getBytes("gbk");
  28.                
  29.                 if(count<0)
  30.                         throw new RuntimeException("非法,截取字节数为负!");
  31.                 //判断输入要截取的字节数是否大于原字符串所对应的字节数组的长度
  32.                 else if(count>bytes.length)
  33.                         return str;
  34.                 //判断输入要截取的字节数是否>0且最后一个字节对应的是否为半个汉字,通过负数判断,因为汉字的gbk编码值<0
  35.                 else if(count>0&&(bytes[count-1]<0))
  36.                 {
  37.                         int n=0;//记录从数组尾部连续数起,汉字所占的字节数,一个汉字占2个字节。
  38.                         for(int x=count-1;x>=0;x--)//从尾部遍历数组
  39.                         {
  40.                                         if(bytes[x]<0)//如果该值<0,则是半个汉字
  41.                                                 n++;         //字节数n+1
  42.                                         else
  43.                                                 break
  44.                         }
  45.                         //如果n是奇数,则说明最后一个字节对应的是半个汉字
  46.                         if(n%2==1)
  47.                                 count--;  //是汉字,则减1
  48.                 }

  49.                 byte[] newBytes=new byte[count];
  50.                 for(int i=0;i<count;i++)
  51.                         newBytes[i]=bytes[i]; //将bytes数组中的值赋给新字节数组
  52.             
  53.                 String newString=new String(newBytes);
  54.                 return newString;

  55.         }
  56. }
复制代码


回复 使用道具 举报
本帖最后由 franksight 于 2015-2-16 11:14 编辑
  1. import java.io.*;

  2. /**
  3. * 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
  4. * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  5. * @author frank
  6. */

  7. public class Test10 {
  8.         public static void main(String[] args) throws IOException
  9.         {
  10.                 System.out.print("请输入字符串:");
  11.                 BufferedReader bufStr=new BufferedReader(new InputStreamReader(System.in));
  12.                 String str=bufStr.readLine();
  13.                 int count=0; //记录要截取的字节数
  14.                 //System.out.print("请输入要截取的字节数:");
  15.                 //从键盘输入所要截取的字节数
  16.                 //BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
  17.                 //count=Integer.parseInt(buf.readLine());//将输入的字符串转换成十进制整数,并用count记录
  18.                 //System.out.println(splitString(str,count));        //调用截取字符串函数,并输出结果
  19.                 //可用以下函数测试截取的所有情况,或直接用上5句自行测试。。。
  20.                 exam(str);

  21.         }
  22.                 //测试所以截取结果
  23.                 public static void exam(String str) throws UnsupportedEncodingException
  24.                 {
  25.                         for(int x=str.getBytes("gbk").length;x>0;x--)
  26.                         {
  27.                                 if(splitString(str,x).contains("?"))//若包含半个汉字,则字符串中会有'?'出现
  28.                                 {
  29.                                         System.out.println(str+" 在截取第"+x+"个字节时出错!");
  30.                                         break;//跳出循环,不在截取
  31.                                 }
  32.                                 else
  33.                                         System.out.println(str+" 截取第 "+x+"个字节!"+splitString(str,x));
  34.                         }
  35.                 }       
  36.         //截取字符串函数   str:字符串   count:要截取的字节数
  37.         public static String splitString(String str,int count) throws UnsupportedEncodingException
  38.         {
  39.                 byte[] bytes=null;//定义字节数组,初始为null
  40.                 //用gbk对str进行编码,并将结果存储到bytes数组中
  41.                 bytes=str.getBytes("gbk");
  42.                
  43.                 //判断输入要截取的字节数是否为正整数
  44.                 if(count<0)
  45.                         throw new RuntimeException("非法,截取字节数为负!");
  46.                 //判断输入要截取的字节数是否大于原字符串所对应的字节数组的长度
  47.                 else if(count>bytes.length)
  48.                         return str; //若大于,则直接返回原字符串
  49.                 //判断输入要截取的字节数是否>0且最后一个字节对应的是否为半个汉字,通过负数判断,因为汉字的gbk编码值<0
  50.                 else if(count>0&&(bytes[count-1]<0))
  51.                 {
  52.                         int n=0;//记录从数组尾部连续数起,汉字所占的字节数,一个汉字占2个字节。
  53.                         for(int x=count-1;x>=0;x--)//从尾部遍历数组
  54.                         {
  55.                                         if(bytes[x]<0)//如果该值<0,则是半个汉字
  56.                                                 n++;         //字节数n+1
  57.                                         else
  58.                                                 break;//跳出循环
  59.                         }
  60.                         //如果n是奇数,则说明最后一个字节对应的是半个汉字
  61.                         if(n%2==1)
  62.                                 count--;  //是汉字,则减1
  63.                 }

  64.                 byte[] newBytes=new byte[count]; //定义一个大小为count的新字节数组
  65.                 for(int i=0;i<count;i++)
  66.                         newBytes[i]=bytes[i]; //将bytes数组中的值赋给新字节数组
  67.                 //将新字节数组中的值转换成字符串
  68.                 String newString=new String(newBytes);
  69.                 return newString;

  70.         }
  71. }
复制代码



以上代码带有测试截取结果的函数,
只要输入任意一个字符串,它会把所以截取情况列出来。。。

回复 使用道具 举报
这个视频里有讲的啊
回复 使用道具 举报
血色@残阳 发表于 2015-2-14 23:26
之前在网上看到了关于这题的一些代码,基本上都是有很大问题的,反正我是没有找到完全正确的代码的,后来我 ...

第22行应该是||
回复 使用道具 举报
感谢分享
回复 使用道具 举报
学习一下
回复 使用道具 举报
wtjohn 发表于 2015-2-16 11:11
这个视频里有讲的啊

这个是在哪个视频里头讲到了啊?我怎么没注意呢。。。求出处。看了半天头都大了。。
回复 使用道具 举报
挥斥方遒 发表于 2015-4-18 21:01
这个是在哪个视频里头讲到了啊?我怎么没注意呢。。。求出处。看了半天头都大了。。 ...

30天版的视频 第27天的内容
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马