我的作业要求我采用不同整数形式的数据集,并通过一种方法运行它们,该方法将打印适当数量的字符以创建水平条形图。 该图需要使用由块元素(█、▏、▌)组成的字符串。这些块以 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;
}
如何运行类似的循环但具有余数或小数点值?
将您的值四舍五入到最接近的 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 ███████████▍
这是一种方法。请注意,此答案中的所有计算都是整数算术。不使用浮点数。
%
运算符计算余数,这将给出部分块的大小。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);
当然,空格字符不适合该模式,因此必须对此进行检查。