如何保持数组中的连续计数?

时间:2019-11-21 02:41:09

标签: java arrays

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

1 个答案:

答案 0 :(得分:1)

好吧,正如您所评论的,本质上来说,您希望函数对一个值出现在数组中的次数进行计数,然后再使用相继的计数来更新该数组(各个元素)。

换句话说,您要使用数组中显示的相应“频率”来更新值。

为此,我建议您使用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]

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

有关讨论,您可以检查此question

Obs .:我发布的方法尚未优化,仅用于双重使用。