Java中printf动态间距实现优化:寻求更简洁方案
冒泡排序动态间距优化问题
我编写了如下BubbleSort(冒泡排序)代码,功能可正常运行,但其中的动态间距实现方式较为繁琐,请问是否存在更直接的实现方法?
public class BubbleSort{ static int[] unsorted = new int[10]; public static void main(String[] args)throws InterruptedException{ clearScreen(); for(int i = 0; i < 10; i++){ unsorted[i] = (int) (Math.random() * 100); } printArray(); Thread.sleep(3000); int x = 0; String space=" "; for (int i = 0; i < unsorted.length - 1; i++){ for(int j = 0; j < unsorted.length - 1 - i; j++){ if(unsorted[j] > unsorted[j+1]){ int temp = unsorted[j]; unsorted[j] = unsorted[j+1]; unsorted[j+1] = temp; } if(x == 0) System.out.printf("\n" + "%2d %2d\n",j,(j+1)); else System.out.printf("\n%" +x + "s%2d %2d\n",space,j,(j+1)); x+=4; if(x > 34)x = 0; printArray(); Thread.sleep(1000); System.out.println(); } } } }
优化方案
你的动态间距逻辑核心是为每次循环的索引输出递增缩进,超过34后重置。可以通过以下几种方式简化:
1. 统一格式化逻辑,去掉分支判断
原代码中通过x==0的分支区分输出格式,完全可以合并成一条格式化语句:
// 替换原有的if-else输出代码 System.out.printf("\n%" + x + "s%2d %2d\n", "", j, j+1);
当x为0时,%0s不会输出任何空格,效果和原分支完全一致,同时减少了代码分支,更简洁。
2. 用总循环步数计算缩进值
不需要单独维护x变量,可以用总循环次数直接计算缩进长度,逻辑更直观:
// 在外层循环前声明总步数计数器 int totalSteps = 0; // 内层循环中替换原x的维护逻辑 totalSteps++; int x = (totalSteps - 1) * 4; if (x > 34) { totalSteps = 1; x = 0; } // 直接使用上面计算的x输出 System.out.printf("\n%" + x + "s%2d %2d\n", "", j, j+1);
这种方式把缩进值的计算和总循环次数绑定,减少了变量维护的复杂度。
3. 封装缩进逻辑为单独函数
如果后续需要修改缩进规则,或者在其他地方复用该逻辑,可以把缩进生成逻辑封装成函数,让主代码更清晰:
private static String getIndent(int step) { int indentLength = (step - 1) * 4; return indentLength > 34 ? "" : " ".repeat(indentLength); }
然后在主循环中调用:
totalSteps++; String indent = getIndent(totalSteps); System.out.printf("\n%s%2d %2d\n", indent, j, j+1);
这样主逻辑的可读性大幅提升,也便于后续调整缩进的步长或上限值。
注意:代码中
clearScreen()和printArray()方法未给出实现,需确保这些方法能正常执行不影响整体功能。
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

