Java:遍历奇偶长度字符串,每次取两个连续字符的更优实现?
优化逐行读取字符串并成对获取字符的方法
你当前的实现已经能适配奇偶长度字符串的需求,但可以从代码简洁性和性能两个维度做优化,以下是几种更优的实现方式:
1. 简化条件判断,让代码更紧凑
把原来的if判断替换为三元表达式,减少代码行数的同时保持可读性:
public void readTwoChars(BufferedReader b) throws IOException { String line; while ((line = b.readLine()) != null) { int lineLen = line.length(); for (int i = 0; i < lineLen; i += 2) { char firstChar = line.charAt(i); // 用三元表达式直接判断是否存在下一个字符 char secondChar = (i + 1 < lineLen) ? line.charAt(i + 1) : 0; // 这里添加你的业务逻辑,比如使用firstChar和secondChar } } }
2. 转字符数组遍历,提升性能
String.charAt()每次调用都会做索引越界检查,把字符串转成char[]后直接访问数组元素,能减少重复的检查开销,适合处理大文本场景:
public void readTwoChars(BufferedReader b) throws IOException { String line; while ((line = b.readLine()) != null) { char[] charArray = line.toCharArray(); int arrLen = charArray.length; for (int i = 0; i < arrLen; i += 2) { char firstChar = charArray[i]; char secondChar = (i + 1 < arrLen) ? charArray[i + 1] : 0; // 业务逻辑处理 } } }
3. 拆分循环逻辑,避免重复判断
如果处理的字符串很长,每次循环都做条件判断会有微小的性能损耗,可以把成对字符和最后一个单独字符分开处理,逻辑更清晰:
public void readTwoChars(BufferedReader b) throws IOException { String line; while ((line = b.readLine()) != null) { int lineLen = line.length(); int i = 0; // 先处理所有成对的字符 for (; i <= lineLen - 2; i += 2) { char firstChar = line.charAt(i); char secondChar = line.charAt(i + 1); // 处理成对字符的逻辑 } // 处理最后一个单独的字符(仅当长度为奇数时执行) if (i < lineLen) { char firstChar = line.charAt(i); char secondChar = 0; // 处理单独字符的逻辑 } } }
以上几种方式都能完美适配奇偶长度的字符串,你可以根据业务场景选择:追求代码简洁选第一种,处理大文本选第二种,看重性能或逻辑清晰选第三种。
内容的提问来源于stack exchange,提问作者BeyondeR
相关产品推荐
相关产品推荐

