锁定老帖子 主题:面试题:编写一个截取字符串的函数
精华帖 (0) :: 良好帖 (4) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-11
nianien 写道 //根本和编码没有关系
//考虑的是字符串而不是字符 public class Test { public static String subString(String str, int bytes) { StringBuilder sb = new StringBuilder(); int sum = 0; for (int i = 0; i < str.length(); i++) { String ch = str.substring(i, i + 1); if ((sum += ch.getBytes().length) > bytes) break; sb.append(ch); } return sb.toString(); } public static void main(String[] args) { String str = "我ABC"; System.out.println(subString(str,4)); str = "我ABC汉DEF"; System.out.println(subString(str,6)); } } 正解 |
|
返回顶楼 | |
发表时间:2011-05-11
最后修改:2011-05-11
nianien 写道 //根本和编码没有关系
//考虑的是字符串而不是字符 public class Test { public static String subString(String str, int bytes) { StringBuilder sb = new StringBuilder(); int sum = 0; for (int i = 0; i < str.length(); i++) { String ch = str.substring(i, i + 1); if ((sum += ch.getBytes().length) > bytes) break; sb.append(ch); } return sb.toString(); } public static void main(String[] args) { String str = "我ABC"; System.out.println(subString(str,4)); str = "我ABC汉DEF"; System.out.println(subString(str,6)); } } 你再好好看看题目,如“我ABC” 4,应该截为“我AB”,输入“我ABC汉DEF” 6,应该输出为“我ABC”而不是“我ABC+汉的半个”。再问一下您,ch.getBytes()中默认的编码是什么,您知道吗? 看你程序的输出: |
|
返回顶楼 | |
发表时间:2011-05-11
duronshi 写道 nianien 写道 //根本和编码没有关系
//考虑的是字符串而不是字符 public class Test { public static String subString(String str, int bytes) { StringBuilder sb = new StringBuilder(); int sum = 0; for (int i = 0; i < str.length(); i++) { String ch = str.substring(i, i + 1); if ((sum += ch.getBytes().length) > bytes) break; sb.append(ch); } return sb.toString(); } public static void main(String[] args) { String str = "我ABC"; System.out.println(subString(str,4)); str = "我ABC汉DEF"; System.out.println(subString(str,6)); } } 正解 兄弟,你好好运行一下上面的代码,看是否能得出题目要求的结果。 |
|
返回顶楼 | |
发表时间:2011-05-11
最后修改:2011-05-11
没看大家的解决方案,自己尝试写了下。思路还真不一样。看了下楼主的解决办法,发现自己对JDK的API还需仔细研磨下,贴出菜鸟级的方法大家轻拍
public static void mySubString(String context,int byteIndex){ char [] context_chars = context.toCharArray(); List<Integer> chineseBeginIndex = new ArrayList<Integer>(); //将中文的byteBeginIndex放入集合 int j=0; for(char c : context_chars){ if(String.valueOf(c).matches("[^u4E00-u9FA5]")){ chineseBeginIndex.add(j+1); j+=2; }else{ j++; } } byte [] context_bytes = context.getBytes(); int byteLength = context_bytes.length; byteIndex = byteIndex>byteLength?byteLength:byteIndex; for(Integer v : chineseBeginIndex ){ if(v==byteIndex)byteIndex++; } byte [] resultBytes = new byte[byteIndex]; for(int i=0;i<byteIndex;i++){ resultBytes[i]=context_bytes[i]; } System.out.println(new String(resultBytes)); } public static void main(String[] args) { mySubString("ABC12我是123AS啊", 6); } |
|
返回顶楼 | |
发表时间:2011-05-11
shaomeng95 写道 duronshi 写道 nianien 写道 //根本和编码没有关系
//考虑的是字符串而不是字符 public class Test { public static String subString(String str, int bytes) { StringBuilder sb = new StringBuilder(); int sum = 0; for (int i = 0; i < str.length(); i++) { String ch = str.substring(i, i + 1); if ((sum += ch.getBytes().length) > bytes) break; sb.append(ch); } return sb.toString(); } public static void main(String[] args) { String str = "我ABC"; System.out.println(subString(str,4)); str = "我ABC汉DEF"; System.out.println(subString(str,6)); } } 正解 兄弟,你好好运行一下上面的代码,看是否能得出题目要求的结果。 兄台,我还是坚持认为,这道题考得和编码根本没有任何关系, 你无非需要一种汉字用两个字节,英文用一个字节的编码而已,仅此而已 而你编写的Java程序,ch.getBytes()默认的是当前平台默认编码格式 而在中文环境下就是GBK,而且你可以随便指定编码ch.getBytes("GBK"),这OK 所以核心代码还是下面这个,就三句话而已 public static String subString(String str, int bytes) throws Exception { int i = 1; for (; i <= str.length()&& str.substring(0, i).getBytes("GBK").length <= bytes; i++); return str.substring(0, i - 1); } |
|
返回顶楼 | |
发表时间:2011-05-11
shaomeng95 写道 nianien 写道 //根本和编码没有关系
//考虑的是字符串而不是字符 public class Test { public static String subString(String str, int bytes) { StringBuilder sb = new StringBuilder(); int sum = 0; for (int i = 0; i < str.length(); i++) { String ch = str.substring(i, i + 1); if ((sum += ch.getBytes().length) > bytes) break; sb.append(ch); } return sb.toString(); } public static void main(String[] args) { String str = "我ABC"; System.out.println(subString(str,4)); str = "我ABC汉DEF"; System.out.println(subString(str,6)); } } 你再好好看看题目,如“我ABC” 4,应该截为“我AB”,输入“我ABC汉DEF” 6,应该输出为“我ABC”而不是“我ABC+汉的半个”。再问一下您,ch.getBytes()中默认的编码是什么,您知道吗? 看你程序的输出: 有那么麻烦么? public static String subString(String str, int bytes) throws Exception { int i = 1; for (; i <= str.length()&& str.substring(0, i).getBytes("GBK").length <= bytes; i++); return str.substring(0, i - 1); } |
|
返回顶楼 | |
发表时间:2011-05-11
我也实现了下,不需要用getBytes()这样的方法。
地址:http://zhaiyz.iteye.com/blog/1040743 |
|
返回顶楼 | |
发表时间:2011-05-11
其实, 题目很简单。
想说的是, 楼主的解题思路很清晰, 条件考虑的很仔细, 对编码的考虑确实合理。 也写过这个面试题, 当初没考虑编码, 后来才发现编码不同的环境下, 字符的字节不同。也懒得去改了。 http://myter7.iteye.com/blog/1011715 |
|
返回顶楼 | |
发表时间:2011-05-12
wolf_awp 写道 我也实现了下,不需要用getBytes()这样的方法。
地址:http://zhaiyz.iteye.com/blog/1040743 其实题目的核心就是让汉字占两个字节 StringBuilder或StringBuffer是不用的 我们只需确定截取字符串的下标就可以了! 不同编码情况应该有不同的判断方法 你这里虽然没有用到getBytes()方法,但还是用了unicode。 再次声明,本题和编码是没有关系的 你只需要一种汉字占成两个字节,英文占一个字节的编码,不论这个编码是哪种格式 |
|
返回顶楼 | |
发表时间:2011-05-12
nianien 写道 wolf_awp 写道 我也实现了下,不需要用getBytes()这样的方法。
地址:http://zhaiyz.iteye.com/blog/1040743 其实题目的核心就是让汉字占两个字节 StringBuilder或StringBuffer是不用的 我们只需确定截取字符串的下标就可以了! 不同编码情况应该有不同的判断方法 你这里虽然没有用到getBytes()方法,但还是用了unicode。 再次声明,本题和编码是没有关系的 你只需要一种汉字占成两个字节,英文占一个字节的编码,不论这个编码是哪种格式 UTF-8中汉字是3字节吧 |
|
返回顶楼 | |