2013-10-25 3 views
4

Я пытаюсь решить проблему в Java как часть моего задания. Проблема заключается в следующем:Обнаружение частоты уникальных номеров

Пользователь вводит по десять номеров один за другим по запросу на экране. Затем экран присваивает все различное значение массиву и аналогичный массив, чтобы удержать частоту того, сколько раз эти числа появились.

я сделал ниже работу, но, кажется, я застрял где-то в присвоении частот и различных значений массивов:

import java.util.*; 

public class JavaApplication10 
{ 
    public static void main(String[] args) 
    { 
     int [] numbers = new int [10]; 
     int [] count = new int[10]; 
     int [] distinct = new int[10]; 

     for (int k=0;k<10;k++) 
     { 
      count[k]=0; 
      distinct[k]=0; 
     } 
     java.util.Scanner input = new java.util.Scanner(System.in); 

     System.out.print("Enter number 0: "); 
     numbers[0]=input.nextInt(); 
     count[0]=1; 
     distinct[0]=numbers[0]; 
     int j=0; 
     for (int i = 1;i<10;i++) 
     { 
      System.out.print("Enter number "+i+": "); 
      numbers[i]=input.nextInt(); 

      while(j<i) 
      { 
       if (distinct[j]==numbers[i]) 
       count[j]=count[j]+1; 
       else 
        distinct[j+1]=numbers[i]; 
       j++; 
      } 
     } 
    for (int k=0;k<10;k++) 
    { 
     System.out.println(distinct[k]+ " "+count[k]); 
    } 


     } 
    } 

Я знаю, что это не справедливо, чтобы попросить кого-нибудь помочь мне решить проблема. Но любой намек будет полезен. Спасибо

+0

Ваш первый за цикл лишний. Массивы (примитивные массивы, которые являются запрещающими логические), по умолчанию инициализируются 0. Вам необязательно запрашивать «номер 0» отдельно, вы должны переместить его в цикл for и запустить цикл из 0 (это стандартное использование в любом случае). Ваш while-loop выглядит странно, что он должен делать? – Kayaman

+0

Является ли структура данных описываемой частью задания или вашим собственным решением проблемы? – chrylis

ответ

0

идеальная структура данных было бы Hashmap

действия: 1) инициализировать массив для хранения чисел и для каждого входа

2) Проверьте, если запись HashMap с нажатой клавишей Введенный номер уже существует

3), если существует просто увеличить количество

4) еще создать новую запись с ключом, как количество и считать как 1

так что в конце ваши частоты будут рассчитываться , если вы вынуждены использовать 2 массивы

1) инициализировать два массива

2) для каждого входного контура номер массива и проверить, является ли это число уже в массиве

3) если так взять индекс массива и увеличить значение массива частоты с тем же индексом

4), если не FREQ [индекс] = 1

1

- это номера, ограниченные 0-9? Если это так, я бы просто выполнил задание.

(обратите внимание, вы назначьте вход в переменную под названием "вход"):

числа [0] = вход; кол-во [input] ++;

Также вы можете запустить цикл for в «0», чтобы избежать назначения перед циклом for.

Просто подсказка.

Надеюсь, это поможет!

0

Правильный способ сделать это было бы:

public Map<Integer, Integer> getFrequencies(Iterable<Integer> numbers) { 
    Map<Integer, Integer> frequencies = new HashMap<Integer, Integer>(); 
    for(Integer number : numbers) { 
     if (frequencies.get(number) == null) { 
      frequencies.put(number, 0); 
     } 
     frequencies.put(number, frequencies.get(number) + 1); 
    } 
    return frequencies; 
} 

возвращает карту number -> frequency.

Массивы нет Способ передвижения по Java, их следует избегать, когда это возможно. См. Effective Java, Item 25: Prefer lists to arrays.

0

Я удалил объект Scanner, чтобы быстрее написать код, просто замените его кодом выше, и он должен работать.

int[] numbers = { 1, 2, 2, 2, 3, 3, 3, 1, 1, 2 }; 
    int[] count = new int[10]; 
    int[] distinct = new int[10]; 

    count[0] = 1; 
    distinct[0] = numbers[0]; 
    int disPos = 1; //Current possition in the distinct array 
    boolean valueInarray = false; 
    for (int i = 1; i < 10; i++) { 
     valueInarray = false; 
     for (int d = 0; d < i; d++) { 

      if (numbers[i] == distinct[d]) { 
       count[d] = count[d] + 1; 
       valueInarray = true; 
       break; 
      } 

     } 
     if (!valueInarray) { 
      distinct[disPos] = numbers[i]; 

      count[disPos] = 1; 
      disPos++; 
     } 

    } 
0

Если вы АБСОЛЮТНО ДОЛЖНЫ использовать массивы .. вот способ сделать это ...

import java.util.Scanner; 
import java.util.Arrays; 

public class JavaApplication10 
{ 
    public static void main(String[] args) 
    { 
    int [] numbers = new int [10]; 
    int [] count = new int[10]; 
    int [] distinct = new int[10]; 
    int [] distinct1 = new int[1]; 
    int distinctCount = 0; 
    boolean found = false; 

    Scanner input = new Scanner(System.in); 

    for (int i=0; i<10; i++) { 
    found = false; 
    System.out.print("Enter number " + i); 
    numbers[i]=input.nextInt(); //Add input to numbers array 

    for (int j=0; j<=distinctCount; j++) 
    { 
    if (distinct1[j] == numbers[i]){ // check to see if the number is already in the distinct array 

      count[j] = count[j] + 1; // Increase count by 1 
      found = true; 
      break; 
    } 
    } 

    if (!found) { 
     distinct[distinctCount] = numbers[i]; 
     count[distinctCount] = 1; 
     distinctCount++; 
     distinct1 = Arrays.copyOf(distinct, distinctCount+1); 
    } 

    } 
    for (int j=0; j<distinctCount; j++) 
    System.out.println("The number " + distinct1[j] + " occurs " + count[j] + " times"); 


} 

}

0

Я думаю, что это то, что вам нужно, поправьте меня, если я неправильно ...

import java.util.HashMap; 
import java.util.Scanner; 

public class JavaApplication10 { 
public static void main(String[] args) { 
    // Initializing variables 
    int[] numbers      = new int[10]; 
    HashMap<Integer, Integer> table  = new HashMap<Integer, Integer>(); 
    Scanner input      = new Scanner(System.in); 

    // Getting the 10 inputs 
    for(int x=0; x<10; x++) { 

     // Asking for input 
     System.out.println("Enter number "+x+":"); 
     numbers[x]=input.nextInt(); 

     // If the table contains the number, add 1 
     // Otherwise: set value to 1 
     if(table.containsKey(numbers[x])) 
      table.put(numbers[x], table.get(numbers[x])+1); 
     else 
      table.put(numbers[x],1); 

    } 
    // Closing the reader 
    input.close();  

    // Get the highest and smallest number 
    int highest=0; 
    int smallest=0; 
    for(int i:table.keySet()) { 
     if(i>highest) 
      highest=i; 
     if(i<smallest) 
      smallest=i; 
    } 



    // For every value between the smallest and the highest 
    for (int x=smallest; x<=highest; x++) { 
     // Check if the frequency > 0, else continue 
     if(table.get(x)==null) 
      continue; 
     // Output 
     System.out.println(x+" is "+table.get(x)+" times in \'frequence\'"); 
    } 

} 
} 

Это также обрабатывает отрицательные числа, в отличие от других кодов. Если вы не хотите использовать HashMaps, дайте мне знать, чтобы я мог создать что-то с массивами.

Сообщите мне, если это (не работает)!
Счастливое кодирование (и удачи с вашим назначением);) -Charlie

Смежные вопросы