20 случайных чисел массива от 0 до 10. Как посчитать в нем конкретные числа? - PullRequest
1 голос
/ 21 октября 2019

Я сделал этот массив, но я борюсь с подсчетом чисел. Я мог бы сделать это, используя «IF» 10 раз, но мне это кажется неправильным. Возможно, цикл «для» будет лучше всего использовать здесь, но я не знаю, как подойти к этому.

import java.util.Random;


public class zadanie2 {
    public static void main(String[] args) {
        int array[];
        array = new int[20];


        for (int i = 0; i < array.length; i++) {
            Random rd = new Random();
            array[i] = rd.nextInt(10);
            System.out.print(array[i] + ",");
        }
    }
}

Ответы [ 4 ]

4 голосов
/ 21 октября 2019

Вот быстрое решение для вас. Проверьте следующий код.

    int inputArray[];
    inputArray = new int[20];
    Random rd = new Random();
    HashMap<Integer, Integer> elementCountMap = new HashMap<Integer, Integer>();
    for (int i = 0; i < inputArray.length; i++) {
        inputArray[i] = rd.nextInt(10);
    }
    for (int i : inputArray) {
        if (elementCountMap.containsKey(i)) {
            elementCountMap.put(i, elementCountMap.get(i) + 1);
        } else {
            elementCountMap.put(i, 1);
        }
    }
    System.out.println();
    System.out.println("Input Array : " + Arrays.toString(inputArray));
    System.out.println("Element Count : " + elementCountMap);

Выход:

Массив ввода: [9, 7, 3, 0, 8, 6, 3, 3, 7, 9, 1, 2, 9, 7, 2, 6, 5, 7, 1, 5]

Количество элементов: {0 = 1, 1 = 2, 2 = 2, 3 = 3, 5 = 2, 6 = 2, 7 = 4, 8 = 1, 9 = 3}

Надеюсь, что это решение работает.

1 голос
/ 21 октября 2019

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

Если вы хотите сохранить вхождения, определитеправильная структура данных для этого, иначе вы не сможете их хранить. Я использовал Map<Integer, Integer>, см. Этот пример:

public static void main(String[] args) {
    // define a data structure that holds the random numbers and their count
    Map<Integer, Integer> valueOccurrences = new TreeMap<>();
    // define a range for the random numbers (here: between 1 and 10 inclusively)
    int minRan = 1;
    int maxRan = 10;

    for (int i = 0; i < 20; i++) {
        // create a new random number
        int ranNum = ThreadLocalRandom.current().nextInt(minRan, maxRan + 1);
        // check if your data structure already contains that number as a key
        if (valueOccurrences.keySet().contains(ranNum)) {
            // if yes, then increment the currently stored count
            valueOccurrences.put(ranNum, valueOccurrences.get(ranNum) + 1);
        } else {
            // otherwise create a new entry with that number and an occurrence of 1 time
            valueOccurrences.put(ranNum, 1);
        }
    }

    // print the results
    valueOccurrences.forEach((key, value) -> {
        System.out.println(key + " occurred " + value + " times");
    });
}

В качестве альтернативы вы можете использовать Random, но использовать один экземпляр для всех итераций:

public static void main(String[] args) {
    // define a data structure that holds the random numbers and their count
    Map<Integer, Integer> valueOccurrences = new TreeMap<>();
    // create a Random once to be used in all iteration steps
    Random random = new Random(10);

    for (int i = 0; i < 20; i++) {
        // create a new random number
        int ranNum = random.nextInt();
        // check if your data structure already contains that number as a key
        if (valueOccurrences.keySet().contains(ranNum)) {
            // if yes, then increment the currently stored count
            valueOccurrences.put(ranNum, valueOccurrences.get(ranNum) + 1);
        } else {
            // otherwise create a new entry with that number and an occurrence of 1 time
            valueOccurrences.put(ranNum, 1);
        }
    }

    // print the results
    valueOccurrences.forEach((key, value) -> {
        System.out.println(key + " occurred " + value + " times");
    });
}

Обратите внимание, что эти примеры не создают одинаковые числа в одном и том же диапазоне.

0 голосов
/ 21 октября 2019

Как прокомментировал @deHaar, вы можете использовать Map для этого:

import java.util.Map;
import java.util.Random;
import java.util.TreeMap;

public class CountNum {

    public static void main(String[] args) {
        //create array and Random instance
        int[] array = new int[20];
        Random rd = new Random(System.currentTimeMillis());

        //create Map to count numbers occurrences
        Map<Integer, Integer> counts = new TreeMap<>();

        //fill array with random numbers and count the
        //occurrences in one go...
        for (int i = 0; i < array.length; i++) {
            array[i] = rd.nextInt(10);

            //count inserted number
            counts.put(
                array[i],
                counts.containsKey(array[i]) ? counts.get(array[i]) + 1 : 1
            );
        }

        //print count result:
        System.out.println("\n");
        for (int i : counts.keySet())
            System.out.println("The number " + i +
                    " was inserted " + counts.get(i) + " times.");
    }

}

Это печатает

The number 0 was inserted 1 times.
The number 1 was inserted 1 times.
The number 2 was inserted 3 times.
The number 4 was inserted 1 times.
The number 5 was inserted 1 times.
The number 6 was inserted 5 times.
The number 7 was inserted 3 times.
The number 8 was inserted 3 times.
The number 9 was inserted 2 times.
0 голосов
/ 21 октября 2019

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

    IntStream.range(0, 10)
          .forEach(n -> System.out.println(n + "->" + Arrays.stream(array)
                                                            .filter(i -> i == n)
                                                            .count()));
...