Java数组统计重复元素次数

在数组中不可避免有重复的元素,如果我们想统计重复的个数呢,就需要这样的思路:

  • 遍历数组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);
		}
    }
}

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值