You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:20:32