2010-06-20 3 views
1

각 숫자 발생 빈도를 1D 배열에 넣고 결과를 출력해야합니다. 2 차원에서 1D 부분으로 날 치우고 있습니다. 아직 배열이별로 좋지 않습니다. 내가 추측하는 것 같은2D 배열 출력의 빈도를 계산하여 1D 배열에 할당하려합니다.

public static void main(String[] args){ 

    int matrix [][]=new int[20][2]; 

    for (int row=0;row<matrix.length;row++){ 
    for (int column=0;column<matrix[row].length;column++) 
     matrix[row][column]=(int)(Math.random()*12+1); 

    } 
    frequency(matrix); 




public static int frequency(int [][] matrix){ 
    int [] nums =[12]; 
    int count =0; 
    for (int i=0;i<matrix.length;i++){ 
     for (int j=0; j<matrix[i].length;j++) 
      (???) 

     } 
    return (?); 

답변

2

뭔가 : 일반적으로 값이 잘 배열 인덱스에 해당하지 않는 수집로서이, 인위적인 예를 약간입니다

public static int[] frequency(int [][] matrix){ 
    int [] nums =[14];  // max value can be 13 so you need 14 element 
    int count =0; 
    for (int i=0;i<matrix.length;i++){ 
     for (int j=0; j<matrix[i].length;j++) { 
      nums[matrix[i][j]] += 1; 
     } 
    } 
    return nums; 
} 

, 그래서 해시 맵이 것 보다 일반적인 해결책이 될 수 있습니다.

실제로 매트릭스를 채우기 위해 Math.random() * Math.random() + 1과 같이 2 개의 난수를 곱하면 재미있는 점이 될 것입니다. 최종 주파수 분포.

+0

"사실이 더 재미 2 개 난수 번식하는 것 (처럼 인 Math.random() * 인 Math.random() + 1) 다음 지루한 흰색 대신 좋은 종형 곡선을 얻을 행렬을 채우기 위해 최종 주파수 분포에서 노이즈가 발생합니다. " 재미있게 말하면, 실제로 그 일을 할 계획입니다. 그렇게하는 또 다른 배열이있을 것입니다. –

+0

ROTFL. :-) 다행스럽게도 도움이 될 수 있습니다. –

0

숫자가 지정된 범위 (즉, 코드에 따라 1에서 13까지)에 있다는 것을 미리 아는 경우 Peter Tillemans의 간단한 솔루션을 채택 할 수 있습니다.

다른 해결책은 Map을 사용하여 매트릭스에 포함 된 숫자의 빈도를 저장하는 것입니다. 외부 코드에 Map 인터페이스를 노출하는 것은 원하지 않을 경우

public static Map<Integer, Integer> frequency(int[][] matrix) { 
    Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>(); 

    for (int i = 0; i < matrix.length; i++) { 
     for (int j = 0; j < matrix[i].length; j++) { 
      Integer frequency = 0; 

      if (frequencies.containsKey(matrix[i][j])) { 
       frequency = frequencies.get(matrix[i][j]); 
      } 

      frequencies.put(matrix[i][j], frequency + 1); 
     } 
    } 

    return frequencies; 
} 

, 당신은 또한 결과를 저장하기위한 사용자 정의 데이터 유형을 작성할 수 있습니다. 이 방법으로 결과의 구현을 숨길 수 있으며 (배열,지도 또는 기타) 실제로 필요한 메서드 만 제공 할 수 있습니다.

public class FrequencyResults { 

    private Map<Integer, Integer> frequencies; 

    public FrequencyResults() { 
     frequencies = new HashMap<Integer, Integer>(); 
    } 

    public void increment(int number) { 
     Integer frequency = 0; 

     if (frequencies.containsKey(number)) { 
      frequency = frequencies.get(number); 
     } 

     frequencies.put(number, frequency + 1); 
    } 

    public int get(int number) { 
     Integer frequency = 0; 

     if (frequencies.containsKey(number)) { 
      frequency = frequencies.get(number); 
     } 

     return frequency; 
    } 

} 

이 데이터 형식을 사용하면 frequency 함수가 다음 코드로 확장됩니다. 이 작은 재 작성으로 코드가하는 일을보다 효과적으로 표현할 수 있다고 생각합니다.

public static FrequencyResults frequency(int[][] matrix) { 
    FrequencyResults results = new FrequencyResults(); 

    for (int i = 0; i < matrix.length; i++) { 
     for (int j = 0; j < matrix[i].length; j++) { 
      results.increment(matrix[i][j]); 
     } 
    } 

    return results; 
}