如何在Java控制台应用程序中创建进度条?

时间:2015-08-02 10:39:16

标签: java console-application

我正在尝试制作像这样的进度条

[#        ] 10%
[#####    ] 50%
[#########] 100%

我尝试了什么

public static void main(String[] args) throws InterruptedException {
        String format = "[#          ]%d%%\r";
        for(int i=0;i<=100;i++){
            System.out.print(String.format(format, i));
            Thread.sleep(10);
        }
}

输出:

[#        ] 10%
[#        ] 50%
[#        ] 100%

问题是我无法根据进度增加#计数。

那么如何移动或增加#?

4 个答案:

答案 0 :(得分:2)

您需要编写一段代码,从String开始生成十个字符#,并以空格结尾。将此方法传递给0到100之间的数字。该方法应将数字除以10,将结果四舍五入。这将为您提供十个字符栏中#个字符的数量:

int numPounds = (pct + 9) / 10;

创建一个追加'#' numPounds次的循环,然后追加' '直到字符串的长度为10。在[ ... ]字符之间打印结果以完成练习。

private static final StringBuilder res = new StringBuilder();;

static String progress(int pct) {
    res.delete(0, res.length());
    int numPounds = (pct + 9) / 10;
    for (int i = 0 ; i != numPounds ; i++) {
        res.append('#');
    }
    while (res.length() != 10) {
        res.append(' ');
    }
    return res.toString();
}

public static void main (String[] args) throws java.lang.Exception
{
    for (int i = 0 ; i <= 100 ; i++) {
        Thread.sleep(10);
        System.out.print(String.format("[%s]%d%%\r", progress(i), i));
    }
}

答案 1 :(得分:1)

看看这个

static int current=0;
static int previous=0;
static String previousString="";
public static void main(String[] args) throws InterruptedException {
    String format = "[%s]%d%%\r";

    for (int i = 0; i <= 100; i++) {
        try {
            current=i/10;
            System.out.print(String.format(format, repeat("#",current ), i));
        } catch (ArithmeticException e) {
            System.out.print(String.format(format, repeat("#", 0), i));
        }
        Thread.sleep(10);
    }
}

static String repeat(String StringToRepat, int repetition) {
    if (repetition==previous)
    {
        return previousString;
    }
    StringBuilder builder = new StringBuilder("");
    for (int i = 0; i < repetition; i++)
        builder.append(StringToRepat);
    previousString=builder.toString();
    previous=repetition;
    return previousString;


}

答案 2 :(得分:1)

所有学分都归@Poshemo

public static void main(String[] args) throws InterruptedException {
    final StringBuilder sb  =  new StringBuilder();
    String format = "[%-11s]%d%%\r";

    for(int i=0;i<=100;i++){
        if(i%10==0){
            sb.append("#");
        }
        System.out.print(String.format(format, sb, i));
        Thread.sleep(10);
    }
}

答案 3 :(得分:0)

我需要一个项目的进度条,我只是把它放在Github以防它可以帮助某人。

基本思想是你的主要任务分为子任务,你只需通知栏,子任务的进展就会自动完成显示。

随机时间的示例使用:

ConsoleProgressBar bar = new ConsoleProgressBar(numberOfSubtasks);
bar.startAndDisplay();
for (int i = 0; i < numberOfSubtasks; i += increment) {
 bar.updateAndDisplay(increment);
 Thread.sleep(minrandomTime + rand.nextInt(maxrandomTime - minrandomTime));
}