在数组中不可避免有重复的元素,如果我们想统计重复的个数呢,就需要这样的思路:
-
遍历数组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);
}
}
}