在数组中不可避免有重复的元素,如果我们想统计重复的个数呢,就需要这样的思路:
-
遍历数组array1,取出每一个元素
-
遍历数组array2,判断从array1中取出的元素,是否在array2中出现过。
-
有出现:代表元素已经统计过次数,不需要再次统计,跳过当前循环
-
没有出现:没有统计过,开始统计
-
-
用从array1中取出的元素和数组(array1)中的每一个元素作比较,如果有一样,记录次数,一轮比较完成后输出元素和重复的次数
-
每统计过一个元素,需要记录下
public static void main(String[] args) { //-- 1.声明数组,长度为20 String[] array = new String[20]; //-- arra2中放已经比较过的元素 String[] array2 = new String[20]; //-- index作为array2中存储元素的索引 int index = 0; //-- 2.给数组赋值,元素是A-Z。随机生成 for (int i = 0; i < array.length; i++) { //-- [0,25] -> 26位数 array[i] = (char)((int)(Math.random()*26) + 65) + ""; } System.out.println(Arrays.toString(array)); //-- 3.遍历整个数组array 取数组中的每个元素 for (String str : array) { boolean flag = false; //-- 先判断元素是否已经比较过了 for (int i = 0; i < array2.length; i++) { if (str.equals(array2[i])) { flag = true; break; } } if (flag) { //-- 跳过当前循环,进入下一轮循环 continue; } //-- str就是数组中的每个元素 //-- 需要用这个str和数组中的元素做比较 //-- count 代表每个元素的重复次数,外层循环每递进一次,就表示更换一个元素,count的值要重置 int count = 0; for (int i = 0; i < array.length; i++) { //-- String类型判断是否相等要用equals() if (str.equals(array[i])) { count++; } } //-- 记录统计过的元素 array2[index++] = str; //-- 输出元素和元素重复的次数! System.out.println(str + ":" + count); } } }
对此我们还有另外一种思路:
-
假设数组A存满元素,根据元素的取值范围定义数组B
-
构建元素到数组B下标的映射关系
-
利用数组B中下标所对应的空间来存储数组A中元素出现的次数
-
有使用限制:!!!!!!!!!!!必须知道元素的取值范围!!!!!!!!!!!!!
public static void main(String[] args) {
//-- 提供一个数组
int[] array = new int[10];
//-- 给数组赋值元素,随机赋值: 1-5
for (int i = 0; i < array.length; i++) {
array[i] = (int)(Math.random() * 5) + 1;
}
System.out.println(Arrays.toString(array));
//-- 因为上面数组的取值是1-5.如果-1的话就可以变成0-4.那0-4是一个长度为的数组的索引
//-- 索引会有一个空间与之对应,利用这个空间来存储 索引代表的元素 出现的次数
int[] target = new int[5];
/*
* target的下标: -> 对应到array中的元素
* 0 1
* 1 2
* 2 3
* 3 4
* 4 5
*
* 在array中遇到3这个元素,就需要把3-1,得到2,2就是target的下标
* 然后在target[2]里面放3这个元素出现的次数!
*/
for (int i = 0; i < array.length; i++) {
//-- 从array中取出元素
int element = array[i];
//-- 把这个元素变成target的索引
int index = element - 1;
//-- 在target[index]空间内记录element出现的次数
//-- 出现的次数:第一次出现 记录为1 第二出现.取出已有的次数 + 1
//-- temp就是已经出现的次数
int temp = target[index];
//-- 对次数做加1操作
temp = temp + 1;
//-- 把新的次数再放回index所对应的空间内
target[index] = temp;
}
//-- 打印target
for (int i = 0; i < target.length; i++) {
int element = i + 1;
int count = target[i];
System.out.println(element + ":" + count);
}
}
}