2009-08-15 5 views
2

저는 다음과 같은 출력으로 히스토그램 프로그램을 만들기위한 과제로 초급 Java 클래스를 사용합니다 : (100 및 10은 사용자 입력입니다.)시작 Java (히스토그램)

몇 개의 번호가 있습니까? 100 간격은 몇 개입니까? 10

내 코드는 다음과 같은 출력을 제공하지만 아무도 내가 잘못되어 가고 있다는 것을 지적 할 수 있습니다. 감사합니다. 스레드 "주요"java.lang.ArrayIndexOutOfBoundsException의

예외 : Lab6.main 10 (Lab6.java:44 입력에 대한

How Many Numbers? 10 
How Many Intervals? 10 

Histogram 
-------------------------------------------------------- 
1 **********(10) 
2 **********(10) 
3 **********(10) 
4 **********(10) 
5 **********(10) 
6 **********(10) 
7 **********(10) 
8 **********(10) 
9 **********(10) 
10 **********(10) 

, 100, 10 나는 오류 메시지가) 나는 아래 44 행을 표시했다.

이 코드로 연결되는 링크는 다음과 같습니다.

   intervalValue[j]++; 

내가 발전기 (.JAR) 파일을 첨부하는 방법을 잘 모르겠어요, 단지 우리를 위해 임의 #의를 생성 해. 다시 한번 감사드립니다.

mport java.util.Scanner; 

public class Lab6 { 

    public static void main(String[] args) { 

     int numbers, intervals; 
     double intervalWidth; 

     double max, mins, range; 

     Scanner keyboard = new Scanner(System.in); 

     System.out.print("How Many Numbers? "); 

     numbers = keyboard.nextInt(); 

     System.out.print("How Many Intervals? "); 

     intervals = keyboard.nextInt(); 

     double [] generate = new double[numbers]; 

     generate = randomGenerator(numbers); 

     max = maximum(generate); 

     mins = minimum(generate); 

     range = max - mins; 

     intervalWidth = range/intervals; 

     int [] intervalValue = new int[intervals]; 

     for (int i=0; i < generate.length; i++) { 

      for (int j = 0; j<generate.length; j++){ 
       double imin = mins+j*intervalWidth; 
       double imax = max +j*(intervalWidth); 
       if(generate[i] >= imin && generate[i] < imax) 
        intervalValue[j]++;   //LINE 44 
      } 
     } 

     System.out.println("Histogram"); 

     System.out.println("--------------------------------" + 
          "------------------------"); 

     for (int a=0; a < intervalValue.length; a++) { 

      System.out.print(" " + (a+1) + " "); 

      for (int b=0; b < intervalValue[a]; b++) { 
       System.out.print("*"); 
      } 

      System.out.println("(" + intervalValue[a] + ")"); 
     } 
    } 

    private static double [] randomGenerator(int number) { 
     double [] generate; 

     generate = Generator.getData(number); 

     return generate; 
    } 

    private static double maximum(double [] a) { 

     double max = a[0]; 

     for (int i = 1; i < a.length; i++) {   
      if (a[i] > max) { 
       max = a[i]; 
      }   
     } 

     return max; 
    } 

    private static double minimum(double [] a) { 

     double mins = a[0]; 

     for (int i = 1; i < a.length; i++) { 
      if (a[i] < mins) { 
       mins = a[i]; 
      } 
     } 

     return mins; 
    } 
} 
+0

불행하게도 내가 발전기 클래스없이 컴파일 할 수 없습니다에 대한-각 루프 정상 루프를 인쇄 할 수 있습니다. – Kekoa

+1

이고 이진 파일의 내용을 게시하려고 시도하지 않는 코드 포맷터 (이클립스가 내장되어 있음)를 사용하는 것이 좋습니다. 그것은 도움이되지 않습니다 :) –

답변

0

Eclipse와 같은 IDE를 사용하여 프로그램을 실행하고 44 행이 어디에 있는지 확인하십시오. 그것이 ArrayIndexOutOfBoundsException을 얻는 곳이며, 그것이 당신이 채권에서 벗어나지 않는 것을 확인하는 곳입니다. java의 배열에는 인덱스 0에 첫 번째 항목이 있으므로 배열 10 개 길이가 0,1,2,3,4,5,6,7,8,9로 번호가 매겨집니다. 그것이 10시에 일어난다면, 아마 멀리 한 걸음 더 나아가고있을 것입니다. 거기에 도착하면 "intervalValue [j]"의 j가 10이 아닌지 확인하십시오.

붙여 넣기 한 원본의 줄 번호를 컴파일하거나 수정할 올바른 예외가 없어도됩니다. 훨씬 더 할 일이 없습니다. 그것을 알아 내면 나머지 연구실만큼 많은 지식을 얻을 수 있습니다. 좋은 시도 해봐.

2

당신은 라인 (43)의 끝에서 세미콜론을 제거해야합니다

if(generate[i] >= imin && generate[i] < imax); 

세미콜론은 if 블록이 비어됩니다. 결과적으로 예외가 발생한 행은 무조건 실행됩니다.

당신이 그 문제를 해결하면, 여기 당신이 코드의 더 디버깅을 시작하는 몇 가지 힌트입니다

for (int j = 0; j<generate.length; j++) 
:


이 내부 루프의 종료 조건을 살펴보십시오은

외부 루프에서 생성 된 숫자를 반복합니다. 그래서 각 생성 된 숫자가 속하는 간격을 결정하기 위해 내부 루프의 간격을 반복해야합니다.


당신이 당신의 루프에서 현재 간격의 범위를 결정하기 위해 사용하는 코드를 살펴 보자

double imin = mins+j*intervalWidth; 
double imax = max +j*(intervalWidth); 

이 라인은 정확한 값을 산출하도록 수정 될 필요가있다. 왜 그들이 현재 오류가 있는지 판별하기 위해 약간의 '연필과 종이 디버깅'을하십시오.


이제 나머지는 독자의 연습 문제로 남겨 둘 것입니다. 추가 도움이 필요하면 나중에 다시 확인해 보겠습니다.

+0

+1 좋은 지점, 놓 쳤어. – Fredrik

0
intervalValue[j]++; 

j는 숫자의 수까지가는 그러나 그 두 개의 숫자는 당신이 여기에서 볼 수있는 오류가 발생합니다 동일하지 않을 경우 intervalValue이 간격의 수에서 할당됩니다 온다.

+0

어떻게 만들 수 있습니까? 아니면 같은 오류를 만들 수 있습니까? -Thanks, – Benzle

0

배열 예외는 generate.length를 두 번 사용하면 발생합니다. 붙여 넣은 코드는 여기에서 편집 된 것 같습니다.

그러나 이와는 별도로 중첩 루프에 문제가 있습니다. 첫 번째 내부 루프의 배열 크기가 틀린 경우를 제외하고는 올바른 줄을 따라 가야합니다. 그런 다음 if 문에서 - 해당 값을 늘리려 고합니다. 올바른 간격에있는 경우 해당 값을 단독으로 증가시킵니다. 현재 코드를 사용할 때마다 매번 증가시켜 결과를 설명합니다.

자신의 코드를 촬영하고, 주석 :

for (int i=0; i < generate.length; i++) { 

    for (int j = 0; j<intervals; j++){ // could use intervalValues.length here; it's all preference 
    double imin = mins+j*intervalWidth; 
    double imax = mins +(intervalWidth)*(j+1); 
    if(generate[i] >= imin && generate[i] < imax) 
     // for(int j1 = 0; j1 < intervalValue.length; j1++) <- this was causing the bad output 
     /* I assume the j1 from your code was during a debug attempt. Changed back, 
      since the preceeding loop has been removed */ 
     intervalValue[j]++; 


    } 

} 
2

내가 토요일에 관대 한 기분이 된 이후 나는 그것을 밖으로 시도하고 루프를 다시 썼다.

for (int j=0; j < generate.length; j++) { 
    for(int i = 0; i < intervals; i++) { 
     double imin = mins + i * intervalWidth; 
     double imax = mins + (intervalWidth) * (i + 1); 
     if(i == intervals - 1) imax = Double.POSITIVE_INFINITY; 
     if(i == 0) imin = Double.NEGATIVE_INFINITY; 

     if (generate[j] >= imin && generate[j] < imax) { 
      intervalValue[i]++; 
      break; 
     } 
    } 
} 

무한한 물건은 히스토그램의 최소 및 최대 값을 잡는 것입니다.

+0

모두에게 많은 감사를드립니다. 스택 오버 플로우에 대한 훌륭한 경험이었습니다! – Benzle

1

이렇게하면 아주 좋은 (기본적인) 히스토그램을 얻을 수 있습니다. 그것은

import java.util.HashMap; 
import java.util.Map; 

public class Histogram { 
    public static void main(String[] args) { 
     int[] age = { 25, 26, 33, 26, 27, 21, 26, 33, 21, 33, 21, 38, 19, 19}; 


     HashMap<Integer, Integer> m = new HashMap<Integer, Integer>(); 

     for (int i = 0; i < age.length; i++) { 
      int c = 0; 

      for (int j = 0; j < age.length; j++) { 
       if (age[i] == age[j]) { 
        c++; 
       } 
      } 
      m.put(age[i], c); 

     } 

     System.out.println("Histogram\n------------"); 
     for (Map.Entry<Integer, Integer> entry : m.entrySet()) { 
      int key = entry.getKey(); 
      int value = entry.getValue(); 
      System.out.printf("%3d | ", key); 
      for (int i = 0; i < value; i++) { 
       System.out.print("="); 
      } 
      System.out.print(" " + value); 
      System.out.println(); 
     } 

    } 

Outout을보십시오 : 나는 즉 배열 요소와 주파수를 (이 나타나는 빈도)이 개 관련 값을 유지하기 위해의 HashMap을 사용하고

Histogram 
------------ 
33 | === 3 
19 | == 2 
21 | === 3 
38 | = 1 
25 | = 1 
26 | === 3 
27 | = 1 

.

그런 다음 배열을 따라 각 요소별로 루프를 반복하고 c 변수를 사용하여 해당 빈도를 계산합니다.

그 후 나는

+0

몇 마디로 코드를 설명해 주시겠습니까? 당신의 대답이 훨씬 나아질 것이고 당신은 더 많은 표를 얻을 수 있습니다. – Andrei

+0

두 개의 관련 값, 즉 배열 요소와 빈도 (빈도 표시 빈도)를 유지하기 위해 HashMap을 사용하고 있습니다. 그런 다음 중첩 루프가 배열을 따라 각 요소별로 반복하고 "c"변수를 사용하여 빈도를 계산합니다. 그 후 향상된 루프 및 일반 루프로 인쇄합니다. – Amjad

+0

답변에 설명을 추가했습니다. 기능에서 코드를 설명하는 것을 잊지 마세요 :) 잘 했어! – Andrei