首页 > 解决方案 > 如何在数组中保持运行计数?

问题描述

该方法称为loadArray(),该方法将加载具有指定数量的随机值的数组,并更新数组中的下标以反映随机数的生成次数。这些值将介于 (0, values.length-1) 之间。签名是public static void loadArray(int[] values, int times)

标签: javaarrays

解决方案


好吧,正如您评论的那样,本质上您想要一个函数来计算一个值在数组中出现的次数,然后用出现的计数更新数组(各个元素)。

换句话说,您希望使用数组中出现的它们各自的“频率”来更新这些值。

为此,我向您建议一种使用 Map 结构的方法。

那么它是如何工作的呢?

排除数组生成步骤(仅考虑计数步骤),我们可以想象只是将传递数组的每个值放入一个map只是检查该值是否先前插入。

然后,maps是可以保存一些信息同时将这些信息与键相关联的结构,这就是已知的格式“ key/value”。

执行

好的,为了实现这一点,让我们考虑一个方法,它生成一个带有随机数的数组,对其进行计数,然后根据需要返回一个更新的数组:

public static int[] count(int arrayLength, int rangeOfRandom) {
    //generates the randons
    Random generator = new Random();
    int[] array = new int[arrayLength];
    for (int i = 0; i < array.length; i++) {
        array[i] = generator.nextInt(rangeOfRandom);
    }

    System.out.println("The generated array was: " +
            Arrays.toString(array));

    //counts each value
    HashMap<Integer, Integer> aux = new HashMap<>();
    for (int i = 0; i < array.length; i++) {
        //if the map DOES NOT contains the current array value
        if (!aux.containsKey(array[i])){
            aux.put(array[i], 1); //puts it with "1 counter"
        } else {
            //if not...
            //...overrides the existing value with itself PLUS 1
            aux.put(array[i], aux.get(array[i]) + 1);
        }
    }

    //updates the array
    int[] nArray = new int[array.length];
    for (int key : aux.keySet()){
        for (int i = 0; i < array.length; i++) {
            if (array[i] == key){
                nArray[i] = array[i] + aux.get(key);
            }
        }
    }

    //here we return the updated array
    return nArray;
}

通过做

System.out.println("The result array is: " +
            Arrays.toString(count(5, 10)));

你会得到这样的输出:

The generated array is: [0, 6, 6, 8, 7]
The result array is: [1, 8, 8, 9, 8]

如您所见,这些操作非常基本,您可以轻松地对其进行重构以接收/返回其他参数和/或类型之王。

有关相关讨论,您可以查看此问题

Obs.:我发布的方法没有优化,仅供教学使用。


推荐阅读