2014-07-22 3 views
1

프로그램을 실행하기 위해 응용 프로그램을 사용하는 히스토그램 클래스를 만들려고합니다.별표를 사용하는 Java 히스토그램

public class Histogram 
{ 
    String name; 
    int max; 


    public Histogram (String name, int max) 
    { 
     this.name = name; 
     this.max = max; 
    } 

    int[] count = new int[max+1]; 

    public void add(int numbers) 
    { 
    // Handles out of bounds case 
    if (numbers < 0 || numbers > max) 
     return; 

    count[numbers]++; 
    } 

    public String toString() 
    { 
     String result = name + "\n"; 
     for (int index = 0; index < count.length; index++) 
     { 
     result = result + count[index] + ": "; 
     for (int indexStar = 0; indexStar < count[index]; indexStar++) 
      result = result + "*"; 
     result = result + "\n"; 
     } 
     return result; 
    } 
} 

내 응용 프로그램 : 나는 별표로 만든 히스토그램을 공식화하기 위해 자신의 발생 빈도를 얻기 위해 INT 번호를 추가하는 방법을 알아 내기 위해 고군분투

public class HistogramDataCollector 
{ 
    public static void main (String[] args) 
    { 
     Histogram h = new Histogram ("Favorite Number Survey", 11); 

     h.add(1); h.add(0); h.add(9); h.add(7); h.add(7); 
     h.add(3); h.add(4); h.add(6); h.add(5); h.add(2); 
     h.add(2); h.add(8); 

     System.out.println(h); 
    } 
} 

. 감사합니다.

+0

'for' 루프는 의미가 없습니다. 왜 그것은 메서드 외부에 떠 다니고 있습니까? –

+0

snarky는 아니지만 'for' 루프를 제대로 끝내지 않아서 오류가 발생했을 수 있습니까? (int index = 0; index rayryeng

+0

수를 계산하는 방법을 알 수 없기 때문에 이것은 내 코드의 대략적인 초안입니다. h.add 메서드 안의 숫자의 빈도 – Kristen987

답변

0

가장 먼저해야 할 일은 클래스의 모든 메서드 밖에있는 무의미한 for 루프 코드를 제거하는 것입니다. 이렇게하면 코드를 컴파일 할 수 없습니다. 그러나 일단 코드를 제거하면이 클래스는 곧바로 작동합니다. 또한 클래스에서 사용되지 않으므로 numbers 배열을 제거 할 수 있습니다. count 변수 만 사용하면 이유가 표시됩니다. 그들은 다음과 같이 있도록

또한 다른 노트, 당신은 당신의 생성자와 변수 정의를 변경해야

String name; 
int max; 
int[] count; 

public Histogram(String name, int max) 
{ 
    this.name = name; 
    this.max = max; 
    this.count = new int[max+1]; 
} 

max 때문에 가정하는 이유가 될 0 객체를 생성 이 클래스의 따라서,이 배열은 크기가 이고, 생성자의 변수 max을 읽을 때 변경되지 않습니다. 따라서이 배열을 할당되지 않은 상태로 두어야하며 배열 을 생성자 안에 할당해야합니다.


언급 한대로이 히스토그램 클래스에서 발생 빈도를 얻는 방법과 혼동을 느낍니다. 히스토그램이 무엇인지 정의하십시오. 의 막대 그래프는 데이터에 표시되는 숫자의 빈도 인입니다. 클래스의 count 배열은 입니다.은 빈도 또는 데이터 세트에서 해당 숫자를 몇 번 보았는지 저장합니다. add() 메서드를 사용하고이 메서드에 입력 한 내용은 히스토그램에 표시되는 것으로 나타납니다. 당신이 0 본 횟수는 1 회, 1 2 시간, 데이터 집합에 2 4 배입니다 히스토그램의 작동 방법과 예를 들어

count[0] = 1, count[1] = 2, count[2] = 4 경우, 이것은 의미한다. 따라서 각 숫자의 빈도를 검색하려면 개수 배열의 모든 요소를 ​​반복해야합니다. 위의 예제를 테스터 클래스에서 사용하면 다양한 추가 메서드를 호출 한 후에 각 숫자의 빈도 카운트는 count[0] = 1, count[1] = 1, count[2] = 2, count[3] = 1, count[4] = 1, count[5] = 1, count[6] = 1, count[7] = 2, count[8] = 1, count[9] = 1, count[10] = 0이됩니다.

count의 각 위치는 입니다. 숫자는 번입니다. 따라서 add() 방법의 경우 numbers은보고있는 번호입니다. 따라서 해당 번호에 속한 특정 슬롯에 액세스하고 개수를 1 씩 증가시킵니다. 예를 들어 h.add(0);을 수행하면 과 같으며 count[0] = count[0] + 1;과 같습니다. 액세스 슬롯 0 및 증가 1. 우리는 이것을 1 시간으로 보았습니다. 이후에 h.add로 전화하면 해당 번호가 추가로 표시됩니다.

그러나 추가 방법 은 오류 확인을 수행하지 않습니다.특히 0보다 작거나 max보다 큰 숫자를 지정해야 히스토그램의 빈을 증가 시키려고 할 때 OutOfBoundsException이됩니다. 따라서, 나는 이런 일이 일어나면 아무 것도하지 않고 간단하게 그 방법에서 돌아올 것을 추천합니다. 자동 데이터 세트에서 볼 수있는 최고의 수를 것 0 max이 배열에 모든 요소를 ​​지정합니다 int count[] = new int[max+1];을하는 클래스 정의에서

public void add(int numbers) { 
    // Handles out of bounds case 
    if (numbers < 0 || numbers > max) 
     return; 

    count[numbers]++; 
} 

: 즉. 0 인덱스를 고려하여 1을 추가해야합니다. 이것이 max+1 슬롯을 할당하는 이유입니다. 우리는 귀하의 데이터 세트에있는 가능한 모든 숫자의 빈도를 기록 할 수 있도록하기 위해이 작업을 수행합니다. 이 클래스에서 객체를 만들면 해당 객체가 모두 0으로 재설정되므로 즉시 객체를 사용할 수 있습니다. 내가 주목하고 싶은


한 가지는 당신이 빈의 수를 나타내는 별표를 표시하여 히스토그램을 구현하고 싶었다 말했다는 것이다. 따라서,이처럼 당신의 toString() 방법을 수정해야합니다 :

할 것입니다 위의 코드가 히스토그램에서 각 빈에 대한, 그것은 숫자의 빈도 수를 표시하는 것입니다 무엇
public String toString() 
{ 
    String result = name + "\n"; 
    for (int index = 0; index < count.length; index++) { 
     result = result + index + ": "; // New 
     for (int indexStar = 0; indexStar < count[index]; indexStar++) // New 
      result = result + "*"; // New 
     result = result + "\n"; // New 
    } 
    return result; 
} 

, 뒤에 공백을 넣고 공백을 넣은 다음 해당 공백의 빈도만큼 별표를 배치하십시오. 따라서 첫 번째 예제를 살펴보면 다음과 같이 나타납니다.

0: * 
1: ** 
2: **** 

빈 칸수는 어떻게 표시되는지 알 수 있습니다. 나는이 클래스의 객체를 제대로 만들지 않았기 때문에 히스토그램의 이름은 정의되지 않았다. 그러나 이것은 히스토그램 빈도 계산에 대해 알아야 할 사항입니다.


희망 사항이 귀하의 질문을 해결해줍니다.

+0

고마워요! 그것은 많은 도움이되지만 countIndex에 대한 오류가 있으며 add (int number) 메서드를 사용하면 [number] ++를 계산할 수 있습니까? 왜냐하면 그것은 효과가 없기 때문입니다. – Kristen987

+0

네, 그렇게해야합니다. 그 코드가 올바른 방법입니다. "효과가 없다"는 것은 무엇을 의미합니까? – rayryeng

+0

방금 ​​수정 한'countIndex' 오류가 있습니다. 오류를 발견하기 전에 아마 코드를 사용했을 것입니다. 이제'toString()'메소드를 확인하십시오. – rayryeng