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

如何在Java控制台应用程序中制作进度条?,java,console-application,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.prin

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

[#        ] 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个字符的
字符串
,以
s开头,以空格结尾。将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));
    }
}
private static final StringBuilder res=new StringBuilder();;
静态字符串进度(int-pct){
res.delete(0,res.length());
整数=(pct+9)/10;
for(int i=0;i!=numPounds;i++){
res.append(“#”);
}
while(res.length()!=10){
res.append(“”);
}
return res.toString();
}
公共静态void main(字符串[]args)引发java.lang.Exception
{
对于(inti=0;i来看这个

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;


}
static int current=0;
静态int-previous=0;
静态字符串previousString=“”;
公共静态void main(字符串[]args)引发InterruptedException{
字符串格式=“[%s]%d%%\r”;

对于(int i=0;i所有积分都归@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);
    }
}
publicstaticvoidmain(String[]args)抛出InterruptedException{
最终StringBuilder sb=新StringBuilder();
字符串格式=“[%-11s]%d%%\r”;

对于(inti=0;i我需要一个项目的进度条,我只是把它打开,以防它能帮助别人

基本思想是将主要任务划分为子任务,您只需通知工具栏子任务的进度,显示就会自动完成

随机计时的样本使用:

ConsoleProgressBar=新的ConsoleProgressBar(子任务数);
bar.startandsplay();
for(int i=0;i
lets say(format,1))和(format,2))的输出有什么区别?!您希望显示的最大哈希数(#)是多少?抱歉,我没有回答这个问题。最大哈希数=10;我没有回答这个问题。“问题是我无法增加#计数”你认为代码的哪一部分应该增加#的数量?你为什么这么认为?我想在进度增加的同时增加#的数量。因为它是进度条。我不确定这是否符合你的期望,但请随意要求任何修改/解释。我想
repeat
方法会成功EATE 100的实例<代码> StringBuilder <代码>。是的,但是一旦重复方法块结束,String Bu建器对象将被垃圾收集,因此它不会给您带来麻烦,它比使用String更仁慈。@ ShifarShifz,那么您的解决方案将不会是线程安全的,因为在一个任务的中间可以出现新线程和RE。设置它。正弦任务栏通常在一个线程中调用,以显示其他线程的进度,不建议使用该解决方案。@ShifarShifz现在只创建了10个sb实例,但正如您所见,编辑前的代码更有意义,并且由于此答案不能推广到其他问题,因此我将保持这种方式,但请注意,这是m作为一个优化,这个解决方案离线程安全还很远,创建100 sb通常是无害的。我没有告诉你。如果你粘贴代码会更好,这样我就可以毫无错误地理解你的方法。谢谢,但我想在一行中打印它。我只是修改了你的答案。一个建议:永远不要连接结果str使用循环内的新部分进行初始化,如
hash+=“#”
因为每次您需要创建新字符串时,都需要复制旧字符串和新部分。请改用
StringBuilder
,它将已经有旧字符串的副本,只需
附加
新部分。完成后,如果需要字符串,只需在StringBuilder上调用
toStirng
。很好:)。我是编程新手。非常感谢您提供的信息。@Pshemo:我刚刚修改了答案。请查看并告诉我需要做什么修改。
%s
可以处理,确保它需要10个字符。例如
[%10s]
和字符串
“foo”
将生成
[foo]
[%10s]
将生成
[foo]
。您现在应该能够删除
format=format.replaceFirst(“,”);
,因为您正在使用
%[-limit]s
来确保正确的空格数。
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);
    }
}