【发布时间】:2014-09-15 18:31:25
【问题描述】:
任务是用 Java 创建一个程序,将直方图打印到控制台,显示一组值的频率分布
程序是读取1-100范围内的整数,包括。然后生成一个类似于给定图像上的图表。
到目前为止,我已经想出了以下解决方案,但是老师说它太复杂了,并且有一个更简单的方法来实现它。
我班上没有人知道怎么做,但是我可以看到她对我提出的解决方案的看法,如下所示,因为当我使用第一个时,缩放它时存在问题int 在填充的数组中,对其进行排序。
public void printChart()
{
res = new int[10];
for (int i = 0; i < ia.length; i++) {
int firstDigit = 0;
if (i > 10) {
firstDigit = Integer.parseInt(Integer.toString(ia[i]).substring(0, 1));
}
res[firstDigit] += 1;
}
for (int i = 0; i < res.length; i++) {
System.out.format("%-10s %-5s", (i) + "1" + " - " + (i+1) + "0", "|");
for (int o = 0; o < res[i]; o++) {
System.out.print("*");
}
System.out.println("");
}
}
她建议我创建一个包含与原始数组相同数量的新数组,有点像我在这里写的,但我似乎无法弄清楚如何循环通过它来打印出来。她甚至说没有 if 语句是可能的,所以我想我必须在 for 循环中写一些条件。
public void printChart2()
{
res = new int[NUMBERS];
// Fill the other array, by counting the amount of a specific int
// and placing it on the given relevant index
for (int i = 0; i < ia.length; i++) {
res[ia[i]] += 1;
}
for (int i = 0; i < res.length; i += 10) {
System.out.format("%-10s %-5s", (i+1) + " - " + (i+10), "|");
}
}
这是我的字段和构造函数,以防万一。
private final int NUMBERS = 100;
private final int RANDOMMAX = 99;
private int[] ia;
private int[] res;
public Arbitrary()
{
ia = new int[NUMBERS];
for (int i = 0; i < NUMBERS; i++) {
ia[i] = (int) (Math.random() * RANDOMMAX) + 1;
}
printChart();
}
【问题讨论】:
-
你可以使用
%mod by length ofres,而不是做substring来获得正确的bucket,这会给你正确的bucket。 -
我相信如果你想复制一个数组,你会这样做:
for (int i = 0; i < ia.length; i++) {res[i] = ia[i];} -
太棒了,这简化了我自己的程序版本,并使其可扩展
-
@Pokechu22 我不想对其进行排序,因此新数组中的给定点包含 1 的 2 的 3 的数量,依此类推: res[9] = 3 (instances 9) 这样她说可以创建带有嵌套循环且没有 if 的所示图表
-
@user1277041 不幸的是,我无法看到图像对我的问题有影响。抱歉,这没有帮助。
标签: java arrays loops logic nested-loops