Как я могу создать список массивов(indexOf) для отображения вхождений определенного числа в массиве?

#java #arrays #arraylist

Вопрос:

//Программа генерирует 500 случайных чисел в диапазоне от 0 до 9, а затем отображает количество вхождений каждого числа.

Я новый программист, у кого-нибудь есть идеи, как решить этот вопрос, используя что-то из списка массивов, в частности indexOf ? Приведенный ниже код-это то, что я закодировал с помощью простых 1d-массивов.

 int []randomNum = new int[500];
int zero = 0, one = 0, two = 0, three= 0, four = 0, 
    five = 0, six = 0, seven = 0, eight = 0, nine = 0;

for (int i = 0; i < randomNum.length; i  ) {
    randomNum[i] = (int)Math.floor(Math.random()*(9-0 1));

    if (randomNum[i] == 0) {
        zero  ;
    } else if (randomNum[i] == 1) {
        one  ;
    } else if (randomNum[i] == 2) {
        two  ;
    } else if (randomNum[i] == 3) {
        three  ;
    } else if (randomNum[i] == 4) {
        four  ;
    } else if (randomNum[i] == 5) {
        five  ;
    } else if (randomNum[i] == 6) {
        six  ;
    } else if (randomNum[i] == 7) {
        seven  ;
    } else if (randomNum[i] == 8) {
        eight  ;
    } else if (randomNum[i] == 9) {
        nine  ;
    }
}
System.out.printf( "%-15s  s  %n", "Number", "Occurrence");
System.out.printf( "%-15s  s  %n", "0", zero);
System.out.printf( "%-15s  s  %n", "1", one);
System.out.printf( "%-15s  s  %n", "2", two);
System.out.printf( "%-15s  s  %n", "3", three);
System.out.printf( "%-15s  s  %n", "4", four);
System.out.printf( "%-15s  s  %n", "5", five);
System.out.printf( "%-15s  s  %n", "6", six);
System.out.printf( "%-15s  s  %n", "7", seven);
System.out.printf( "%-15s  s  %n", "8", eight);
System.out.printf( "%-15s  s  %n", "9", nine);
 

Ответ №1:

Есть лучшие и эффективные способы сделать это, но это мое простое решение.

 Integer[] randomNum={1,2,3,4,5,2,4,5,3,2,1};
    Set<Integer> set= new HashSet<>(Arrays.asList(randomNum));
    System.out.println(set);
    int count=0;
    for (Integer i:set){
        for (Integer j:randomNum){
            if (i ==j){
                count  ;
            }
        }
        count=0;
        System.out.println("number of " i  " is "  count);

    }
 

Ответ №2:

Вполне нормально использовать обычный int[] для подсчета частот элементов, и использование List / ArrayList и их методов кажется немного избыточным. После вычисления частот массив может быть преобразован в список.

Однако существующее решение предлагает много дублированного кода, который может быть значительно сокращен:

  1. Массив randomNum избыточен, может быть вычислена одна случайная цифра
  2. Для подсчета и печати частот лучше использовать массив вместо отдельных int значений.
  3. Лучше использовать метод nextInt класса Random вместо вычисления с помощью Math.random()
 final int SEQ_LENGTH = 500;
final int NUM_COUNT = 10;

int[] frequency = new int[NUM_COUNT];

Random randomGenerator = new Random();

for (int i = 0; i < SEQ_LENGTH; i  ) {
    int num = randomGenerator.nextInt(NUM_COUNT);
    frequency[num]  ;
}

System.out.printf( "%s  %s%n", "Number", "Occurrence");

for (int i = 0; i < frequency.length; i  ) {
    System.out.printf( "m  d %n", i, frequency[i]);
}

List<Integer> counts = Arrays.stream(frequency).boxed().collect(Collectors.toList());
System.out.println(counts);

int digit = 2;
System.out.printf("The occurrence of %d's is %d%n", digit, counts.get(digit));
 

Выход:

 Number  Occurrence
     0          54 
     1          40 
     2          45 
     3          57 
     4          47 
     5          50 
     6          59 
     7          50 
     8          47 
     9          51 
[54, 40, 45, 57, 47, 50, 59, 50, 47, 51]
The occurrence of 2's is 45