如何获取基于循环的范围内的进度信息?

时间:2017-06-07 08:59:20

标签: java

我有一个很长的for循环运行,我想打印一些进度信息。

对于正常的for循环,这很容易,因为你可以将循环变量除以最大值来获得进度指示器,即执行以下操作:

for(int i = 0; i<container.size(); i++) {
  if(i%10==0) System.out.println("Progress " +  Double.toString(i/container.size()*100.0) + "%.")
}

有没有办法在不添加计数器变量的情况下做这样的事情(以某种方式违背了基于循环的范围的目的)?

//... Foreach loop over all elements in arr.
for (type var : arr) {
    body-of-loop
    // print progress info here?
}

2 个答案:

答案 0 :(得分:1)

关于问题的核心:您无法从基于范围的for循环中获取任何进度信息。主要是因为可能没有。您可以轻松地为其创建Iterable

for (T t : iterable) {
    ...
}

是一个无限循环。您 知道您要迭代的元素数量。

然后,解决方案可能取决于容器的类型。如果是List,则可以使用索引访问

for (int i=0; i<list.size(); i++) {
    if (i%10==0) System.out.println("Step "+i+" of "+list.size());

    T t = list.get(i);
    doSomethingWith(t);
}

否则,您可能不得不引入一个计数器变量:

int step = 0;
for (T t : set) {
    if (step%10==0) System.out.println("Step "+step+" of "+set.size());

    doSomethingWith(t);
}

从更高层次的角度来看:我强烈建议考虑您是否需要概括此类进度信息。如果这不仅仅用于调试,那么你应该/至少可以将它提取到一个函数中:

int step = 0;
for (T t : set) {
    reportProgress(step, set.size());

    doSomethingWith(t);
}

private static void reportProgress(int step, int total) {
    if (step%10==0) System.out.println("Step "+step+" of "+total);
}

更通用的可能是使用(功能)界面,比如

interface ProgressReporter {
    void reportProgress(String message, int step, int total);
}

// Using it:
int step = 0;
for (T t : set) {
    progressReporter.reportProgress("My loop", step, set.size());

    doSomethingWith(t);
}

例如,您可以在以后显示ProgressBar的进度,将进度重定向到Logger,或更改报告间隔(例如从step%10更改为step%100一般step%(total/10+1)if [ "${fle_nme: -4}" != ".pdf" -a "${fle_nme: -4}" != ".PDF" ]; then

答案 1 :(得分:0)

你有几个问题,

  • int / intint例如5/10 = 0(剩余5个)
  • 格式将打印16位精确度,看起来很难看。

我建议你试试

for (int i = 0; i < container.size(); i++) {
   if (i % 10 == 0) 
       System.out.printf("Progress %.1f%%\n", 100.0 * i / container.size());
}

首先乘以100.0 *,数字变成double所以当你进行除法时,它是一个浮点数。

你也可以调整分数

int logEvery = Math.max(10, container.size() / 100);
for (int i = 0; i < container.size(); i++) {
   if (i % logEvery == 0) 
       System.out.println("Progress " + 100 * i / container.size() + "%");
}

这不使用浮点数,而是先将数字乘以100,而不是丢弃完成的部分。

您可以使用整数和浮点的组合

int logEvery = Math.max(10, container.size() / 1000);
for (int i = 0; i < container.size(); i++) {
   if (i % logEvery == 0) 
       System.out.println("Progress " + 1000 * i / container.size() / 10.0 + "%");
}

乘以1000并除以10.0,得到一个百分比但有一位小数。