如何根据余数、百分比或浮点值进行循环?

问题描述 投票:0回答:2

我的作业要求我采用不同整数形式的数据集,并通过一种方法运行它们,该方法将打印适当数量的字符以创建水平条形图。 该图需要使用由块元素(█、▏、▌)组成的字符串。这些块以 8 为基数,因此输入 8 作为整数应打印“█”,而 16 应打印“██”。

我找到了一种方法来打印可被 8 整除的输入的正确块数,但我不确定如何处理不均匀除法的余数或小数值,例如,如果 (9 / 8) = 1.125,0.125怎么用?

这就是我到目前为止所拥有的。它打印 8 的倍数的适当字符数。

public static String getHorizontal(int value) {
   String bar = "";
   double realMath = (double) value / 8; // (1/8) = (0.125) (8/8) = 1
   int rmConversion;

   while (realMath % 1 == 0) {
       rmConversion = (int) realMath;
       for (int i = 0; i < rmConversion; i++) {
           bar += "█";
       }
       return bar;
   }

   // TODO: replace this with code that actually generates the bar graph!

   return bar;
}

如何运行类似的循环但具有余数或小数点值?

java loops floating-point fractions
2个回答
0
投票

将您的值四舍五入到最接近的 0.125

x = Math.round(x / .125) * .125

然后,确定要使用哪个第8块

x -= (long) x;
char c = 0x258f;
while (x > 0) {
    c--;
    x -= .125;
}

这是一个例子。

String getHorizontal(double x) {
    String s = "█".repeat((int) x);
    x = Math.round(x / .125) * .125;
    x -= (long) x;
    char c = 0x258f;
    while (x > 0) {
        c--;
        x -= .125;
    }
    return s + c;
}

这是一个输出。
您需要不同的字体,它适用于 Source Code Pro

1.125 █▎
5.625 █████▊
11.25 ███████████▍

0
投票

这是一种方法。请注意,此答案中的所有计算都是整数算术。不使用浮点数。

  • 除以 8 计算所需的完整块数。
  • 将该数字加 1,为部分块保留空间。
  • 创建一个在上一步中确定的长度的数组,并填充完整的块字符。
  • 使用
    %
    运算符计算余数,这将给出部分块的大小。
  • 将填充数组中的最后一个字符替换为空格或部分块,具体取决于余数计算的结果。
  • 如果您确实需要循环,请将
    Arrays.fill
    调用替换为循环。
 public static String bar (int value) {
        final char FULL_BLOCK = '█';
        char [] partBlock = {' ','▏','▎','▍','▌','▋','▊','▉' };
        char [] theBar = new char [value / 8 + 1];
        Arrays.fill (theBar, FULL_BLOCK);
        theBar [theBar.length - 1] = partBlock [value % 8];
        return new String (theBar);
    }
   
    public static void main(String[] args) {
        System.out.println ("Growing Bar:");
        for (int i = 0; i <= 24; ++i) {
            System.out.println (bar (i));
        }

测试:

Growing Bar:
 
▏
▎
▍
▌
▋
▊
▉
█ 
█▏
█▎
█▍
█▌
█▋
█▊
█▉
██ 
██▏
██▎
██▍
██▌
██▋
██▊
██▉
███

整个块和部分块之间的高度不均匀似乎是 Stack Overflow 使用的字体造成的。我在其他地方(例如我的 IDE、电子邮件或文本编辑器)中没有看到测试结果存在这种差异。

使用

partBlock
数组的另一种方法是利用部分块是 Unicode 中的连续字符这一事实:

int r = value % 8;
theBar[theBar.length - 1] = r == 0 ? SPACE : (char) ('\u2590' - r);

当然,空格字符不适合该模式,因此必须对此进行检查。

© www.soinside.com 2019 - 2024. All rights reserved.