java - 如何在数组中保持运行计数?
问题描述
该方法称为loadArray()
,该方法将加载具有指定数量的随机值的数组,并更新数组中的下标以反映随机数的生成次数。这些值将介于 (0, values.length-1) 之间。签名是public static void loadArray(int[] values, int times)
。
解决方案
好吧,正如您评论的那样,本质上您想要一个函数来计算一个值在数组中出现的次数,然后用出现的计数更新数组(各个元素)。
换句话说,您希望使用数组中出现的它们各自的“频率”来更新这些值。
为此,我向您建议一种使用 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.:我发布的方法没有优化,仅供教学使用。
推荐阅读
- vbscript - IBM PCOMM - 无法从另一个 vbs 宏中调用 vbs 宏
- scala - 如何使用 Scala 在 Akka Actor 中查找意外消息的来源
- sql - SQL - 如何删除两个相互引用的实体
- r - 在R中将字符日期(“01OCT2014”)转换为DATE格式
- php - 读取 CSV 文件的行并将值放入数组
- html - 如何修复 Codepen 中的锚点问题:“Bad path /boomboom/v2
- java - 如何注入在 Guice 中使用辅助注入创建的对象?
- r - 使用二进制变量创建计数器
- solr - 如何为布尔值添加 Hybris Solr By
- ansible - 使用 Ansible 循环访问已注册的文件模块数据