2013-11-25 3 views
0

Я пытаюсь инициализировать массив с 50 целыми значениями и вычислять частоту чисел в диапазоне 10 .. 19. Я думаю, проблема связана с нижней частью кода.Частота массивов

import java.util.Scanner; 
public class Ex1partA { 
    public static void main(String[] args) { 
    Scanner kbin = new Scanner(System.in); 

    int list[]=new int[50];  
    int i=0; 

    System.out.print("\n\tInput numbers from 10 to 19: \n"); 

    while (i < 50) { 
     int value = kbin.nextInt(); 
     if (value >= 10 & value <= 19) { 
     list[i] = value; 
     i++; 
     } else { 
     System.out.println("!! Bad number !!"); 
     } 
    } 

    for (int value : list) { 
     System.out.println("" + value); 
    } 
    } 
} 
+0

Укажите нижнюю часть .. :-) –

+0

В чем проблема? Это похоже на домашнюю работу. –

+0

очень последняя строка "System.out.println (" "+ значение);" –

ответ

2

Я пытаюсь инициализировать массив с 50 целыми значениями и вычисляют частоту чисел в диапазоне от 10 .. 19.

Для расчета частоты, то лучше поместить все числа в List и сосчитать частоту использования Collections.frequency

List<Integer> freqList=new ArrayList<Integer>(); 
    // Add numebers to this list. 

    for (int i = 10; i <20; i++) { 
     int freq=Collections.frequency(freqList, i); 
         // This will return frequency of number 

     System.out.println(i+" "+freq); 
    } 
+0

Ответ, который вы подали в ложу Масуду [здесь] (http://stackoverflow.com/questions/20207346/create-a-method-called-shortest-that-takes- 2-strings-and-returns-the-string), просто учит его просить о домашних решениях. Пожалуйста, не делайте ложных ответов. Пожалуйста, не поощряйте такое поведение. –

+0

Я имею в виду BaderK. –

0

Вы страдаете от некоторых проблем дизайна. В частности, вы сталкиваетесь с задачей получения ваших номеров с задачей подсчета частоты.

import java.util.Scanner; 
public class Ex1partA { 
    public static void main(String[] args) { 
    Scanner kbin = new Scanner(System.in); 

    //Get all inputs 
    List<Integer> inputs = getInputs(10,19); 
    //Count the frequency 
    Map<Integer, Integer> freq = countFrequency(inputs); 

    for (int key : freq.keySet()) { 
     System.out.println(key + ": " + freq.get(key)); 
    } 
    } 

    public static List<Integer> getInputs(int min, int max) { 
    List<Integer> list = new ArrayList<Integer>(); 
    System.out.print("\n\tInput numbers from 10 to 19: \n"); 
    int i=0; 
    while (i < 50) { 
     Integer newNumber = kbin.nextInt(); 
     if (newNumber < max && newNumber > min) { 
     list.add(newNumber); 
     } else { 
     System.out.println("Bad number. Ignoring.");//Note this simply skips, does not ask for re-entry of bad numbers 
     } 
     i++; 
    } 
    return list; 
    } 

    // Finds the frequency of the input list and out puts it as 
    // a map of number => how many times that number appears 
    public static Map<Integer, Integer> countFrequency(List<Integer> input) { 
    Map<Integer,Integer> freq = new HashMap<Integer,Integer>(); 
    for (Integer val : input) { 
     Integer currentCount = freq.get(val); 
     freq.put(val, currentCount + 1); 
    } 
    return freq; 
    } 
} 

Позволяет отметить несколько ключевых моментов:

  • Каждая функция должна сделать ровно одно, если это вообще возможно. Итак, здесь у нас есть функция, которая получает все входы (в пределах определенного диапазона), а другая, которая учитывает частоту списка чисел.
  • Использование полных объектов, а не примитивных массивов дает вам много гибкости и мощности без накладных расходов на то, что вы должны вручную массировать данные.
  • В частности, здесь важна концепция Map. Вы «сопоставляете» ключ (который в этом случае является входным значением, предоставленным пользователем числом от 10 до 19) со значением (которое в этом случае является числом раз, когда этот номер отображается в списке номеров, которые вы иметь).
  • & &, а не &, чтобы применить логическое И к двум другим булевым операторам.
  • Обратите внимание, что Collections API предоставляет методы подсчета частоты, которые позволят вам избежать самоопределения.
-1

Вам не нужен массив размера 50. Для вашей проблемы, так как вы знаете, число будет находиться в диапазоне [10,19], создать массив размера 20. Использование массивов можно реализовать что-то вроде этого

Scanner kbin = new Scanner(System.in); 
    int i = 0; 
    int arr[] = new int[20]; 
    // fill the array with -1, it will be used for counting 
    // can be done using a for loop as well 
    Arrays.fill(arr, -1); 
    System.out.print("\n\tInput numbers from 10 to 19: \n"); 

    while (i < 50) 

    { 

     int value = kbin.nextInt(); 
     // check the value is in the specified range 
     if (value >= 10 && value <= 19) { 
      // treat the array index as your repeated number 
      // if the number occurs again, just increment it by 1 
      arr[value] = arr[value] + 1; 
      // move to next input 
      i++; 
     } else { 
      System.out.println("!! Bad number !!"); 
     } 

    } 
      //start with index 10 as we know the range 
    for (int j = 10; j < 20; j++) { 
     // check if value stored is greater than -1 
     // if it is greater than -1 then we have a number in the specified 
     // range 
     if (arr[j] > -1) { 
      // need to add +1 because the array was initially filled with -1 
      System.out.println(j + " Occurs " + (arr[j] + 1) + " times "); 
     } 
    } 
Смежные вопросы