我有一个很长的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?
}
答案 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 / int
是int
例如5/10 = 0(剩余5个)我建议你试试
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,得到一个百分比但有一位小数。