Java 生成直方图和星图时输出不正确

Java 生成直方图和星图时输出不正确,java,arrays,Java,Arrays,我试图制作一个柱状图,用户输入1-100之间的数字,然后程序会看到1-10、11-20中有多少数字,等等 目前,如果输入为12345678,则列表81-90将显示8颗星,所有列表都有8颗星。显然,这不是我想要的,但我被难住了 代码如下: import java.util.*; public class test5 { public static void main (String [] args) { int i = 0; int[] Array = new int[10]; L

我试图制作一个柱状图,用户输入1-100之间的数字,然后程序会看到1-10、11-20中有多少数字,等等

目前,如果输入为12345678,则列表81-90将显示8颗星,所有列表都有8颗星。显然,这不是我想要的,但我被难住了

代码如下:

import java.util.*;

public class test5
{
public static void main (String [] args)
{
  int i = 0;
  int[] Array = new int[10];

  List<Integer> list = new ArrayList<Integer>();

  Scanner s = new Scanner(System.in);

  System.out.println ("Please enter any number of values (from 1 - 100 only) ending with -1 when done:");
  while(i != -1){            
     i = s.nextInt();
     if(i != -1) 
        list.add(i);
  }           

  for (int a = 0; a < list.size(); a++){
     int range1 = 1;
     int range2 = 10;
     for (int b = 0; b < list.size(); b++){
        if (list.get(b) >= range1 && list.get(b) <= range2)
           Array[a] += 1;
     }  
     range1 += 10;
     range2 += 10;  
  }

  for (int count = 0; count < 10; count++){
     System.out.print("| " + (count*10+1) + (count == 0 ? " ": "") + " - " + (count*10+10) + (count == 9 ? "" : " ")
     + "| \t");

     for(int h = 0; h < Array[count]; h++)  
        System.out.print("*");  

     System.out.println();  
  } 
}
} 
import java.util.*;
公共类测试5
{
公共静态void main(字符串[]args)
{
int i=0;
int[]数组=新的int[10];
列表=新的ArrayList();
扫描仪s=新的扫描仪(System.in);
System.out.println(“请输入任意数量的值(仅限1-100),完成后以-1结尾:”;
而(i!=-1){
i=s.nextInt();
如果(i!=-1)
列表.添加(i);
}           
对于(int a=0;a如果(list.get(b)>=range1&&list.get(b)更改第一个for循环

在您的第一个for循环中,range1range2不会更改。因为它们被重新标记,并且在执行修改后range1和range2不会被使用:
range1+=10;range2+=10;

在代码Array(int[])中,它存储范围数据的数量,例如

数组[0]存储范围为| 1-10的值的数量|

数组[1]存储范围为| 11-20的值的数量|

数组[9]存储范围为| 90-100的值的数量|

我们可以使用一种简单的方法来增加指定数据范围内的值的数量

以数字11为例,我们可以使用数组[11/10]+=1,这等于数组[1]+=1

确保range1和range2是正确的,或者按照我在下面提到的解决方案进行操作:

改变

for (int a = 0; a < list.size(); a++){
     int range1 = 1;
     int range2 = 10;
     for (int b = 0; b < list.size(); b++){
       if (list.get(b) >= range1 && list.get(b) <= range2)
           Array[a] += 1;
     }  
     range1 += 10;
     range2 += 10;  
 }
控制台中的输出:

 | 1  - 10 |
 | 11 - 20 |    **
 | 21 - 30 |    *
 | 31 - 40 |    **
 | 41 - 50 |    
 | 51 - 60 |    
 | 61 - 70 |    
 | 71 - 80 |    
 | 81 - 90 |    
 | 91 - 100| 

改变你的第一个for循环

在您的第一个for循环中,range1range2不会更改。因为它们被重新标记,并且在执行修改后range1和range2不会被使用:
range1+=10;range2+=10;

在代码Array(int[])中,它存储范围数据的数量,例如

数组[0]存储范围为| 1-10的值的数量|

数组[1]存储范围为| 11-20的值的数量|

数组[9]存储范围为| 90-100的值的数量|

我们可以使用一种简单的方法来增加指定数据范围内的值的数量

以数字11为例,我们可以使用数组[11/10]+=1,这等于数组[1]+=1

确保range1和range2是正确的,或者按照我在下面提到的解决方案进行操作:

改变

for (int a = 0; a < list.size(); a++){
     int range1 = 1;
     int range2 = 10;
     for (int b = 0; b < list.size(); b++){
       if (list.get(b) >= range1 && list.get(b) <= range2)
           Array[a] += 1;
     }  
     range1 += 10;
     range2 += 10;  
 }
控制台中的输出:

 | 1  - 10 |
 | 11 - 20 |    **
 | 21 - 30 |    *
 | 31 - 40 |    **
 | 41 - 50 |    
 | 51 - 60 |    
 | 61 - 70 |    
 | 71 - 80 |    
 | 81 - 90 |    
 | 91 - 100| 
试试这个

for (int count = 0; count < 10; count++) {
        int start = count * 10 + 1;
        int end = count * 10 + 10;
        System.out.print("| " + (count * 10 + 1) + (count == 0 ? " " : "") + " - " + (count * 10 + 10) + (count == 9 ? "" : " ") + "| \t");

        for (int h = 0; h < list.size(); h++)
            if (list.get(h) >= start && list.get(h) <= end)
                System.out.print("*");
        System.out.println();
    }
for(int count=0;count<10;count++){
int start=计数*10+1;
int end=计数*10+10;
系统输出打印(“|”+(计数*10+1)+(计数=0?”:”)+“-”+(计数*10+10)+(计数=9?”:”)+“|\t”);
对于(int h=0;h=start&&list.get(h)试试这个

for (int count = 0; count < 10; count++) {
        int start = count * 10 + 1;
        int end = count * 10 + 10;
        System.out.print("| " + (count * 10 + 1) + (count == 0 ? " " : "") + " - " + (count * 10 + 10) + (count == 9 ? "" : " ") + "| \t");

        for (int h = 0; h < list.size(); h++)
            if (list.get(h) >= start && list.get(h) <= end)
                System.out.print("*");
        System.out.println();
    }
for(int count=0;count<10;count++){
int start=计数*10+1;
int end=计数*10+10;
系统输出打印(“|”+(计数*10+1)+(计数=0?”:”)+“-”+(计数*10+10)+(计数=9?”:”)+“|\t”);
对于(int h=0;h如果(list.get(h)>=start&&list.get(h),这是一个实时演示,允许用户指定数字,并根据数字分布显示十个直方图条:


方法执行直方图逻辑。

这里是一个现场演示,允许用户指定数字,并根据数字分布显示十个直方图条:


方法执行直方图逻辑。

您确定
列表
中有一个size-get-code不能引发该异常,但现在出现了一个新问题,如上面编辑的帖子所示。您确定
列表
中有一个size-get-code不能引发该异常,但现在出现了一个新问题,如上面编辑的帖子所示。Th谢谢你的帮助!我输入了你的代码,它工作得很好。但是,我想看看我的旧代码是否能正常工作,所以我把范围变量放在循环之前,这样他们就不会一直把自己设置为相同的东西,但仍然不起作用。我的第一个循环是可以修复的,还是真的应该被抛出并与你的循环一起使用?顺便说一下,这是一个很好的解决方案。@vb这是因为在第一个循环中,您应该迭代10次(有10个范围),而不是list.size()timesOh哇。谢谢你让我注意到这一点。至少我与我的原始代码接近了。谢谢你的帮助!我输入了你的代码,它工作得很好。但是,我想看看我是否能让我的旧代码正常工作,所以我将范围变量放在循环之前,这样它们就不会一直将自己设置为相同的值但它仍然不起作用。我的第一个循环是可以修复的,还是真的应该扔掉并和你的一起放入?顺便说一下,这是一个很好的解决方案。@vb这是因为在第一个循环中,你应该迭代10次(有10个范围),而不是list.size()timesOh哇。谢谢你让我注意到了这一点。至少我的原始代码差不多完成了。谢谢你的帮助!这也是另一个聪明的解决方案。谢谢你的帮助!这也是另一个聪明的解决方案。
$ java Test5
Please enter any number of values (from 1 - 100 only) ending with -1 when done:
1
2
3
44
66
12
13
100
16
-1
| 1  - 10 |     ***
| 11 - 20 |     ***
| 21 - 30 |
| 31 - 40 |
| 41 - 50 |     *
| 51 - 60 |
| 61 - 70 |     *
| 71 - 80 |
| 81 - 90 |
| 91 - 100|     *