【发布时间】:2019-07-30 19:09:19
【问题描述】:
我想做的很简单,但我想不出它的数学和代码。
我有一个百分比,我在控制台中显示为每个渐进步骤的新数字。所以我知道每一步的确切百分比 1-100。假设一个不断的进展,我想要的是只显示某个指数函数上的数字:
而不是显示:
1,2,3,4,5,6,7....100
我只想显示:
1,2,4,8,15,25,40,65,90,(100)
或者类似的东西。这个想法是显示初始活动,但很快就会降低垃圾邮件的百分比。
我该怎么做?我唯一能想到的是定义一个允许打印的固定数字数组(也许这是最好的解决方案?我觉得应该有一个更优雅的基于数学的解决方案)。嗯,或者也许使用指数函数/缓动曲线填充这样的数组。
添加一些关于如何获取百分比的信息:
for (int i = 0; i < batchjob.size(); i++) {
int percent = 100 * i / batchjob.size();
log.debug("Progress: {}/{} = {}%", i, batchjob.size(), percent));
}
现在我尝试了以下方法:
final Set<Integer> progressDisplay = newHashSet(1, 2, 4, 8, 15, 25, 40, 65, 90, 100);
for (int i = 0; i < batchjob.size(); i++) {
int percent = 100 * i / batchjob.size();
if (progressDisplay.contains(percent)) {
log.debug("Progress: {}/{} = {}%", i, batchjob.size(), percent));
}
}
但是,这会导致如下结果:
1,1,1,1,1,1,1,2,2,2,2,2,2,2,4,4,4,4,4,4,4,8,8,8 ,8,8,8,8...等
解决方案
我选择了接受的答案和固定数组的组合。我最终决定使用一个简单的数组,因为我可以更轻松地调整数字。
final int[] progressDisplay = {1, 3, 8, 20, 50, 75, 100};
int lastMatchingIndex = 0;
for (int i = 0; i < batchjob.size(); i++) {
processBatchJob(batchjob.get(i));
int percent = 100 * i / batchjob.size();
if (progressDisplay[lastMatchingIndex] == percent) {
log.debug("Progress: {}/{} = {}%", i, batchjob.size(), percent);
lastMatchingIndex++;
}
}
【问题讨论】:
-
当安装程序显示稳定的增量进度,直到它卡在 60% 一段时间,然后突然跳到 90%,这是一个错误,不应该尝试实施:P跨度>
-
我同意@thatotherguy,但这是在终端上:)(但也许跳跃不需要那么大)