/**
* 需求:随机生成50个数字(整数),每个数字的范围是[10, 50]
* 统计每个数字出现的次数以及出现次数最多的数字与它的个数
* 最后将每个数字及其出现次数打印出来,如果某个数字出现次数为0,则不要打印它。
* 打印时按照数字的升序排列
*
* 解决思路:
* 首先用一个for循环生成50个【10,50】的整数
* 然后用一个二维数组的第一列接收这50个数字
* 再用二维数组数组的第一列向下进行两两比较,从第一行的第一列开始与后面每一行的第一列比较
* 遇到相同的就将前面这个二维数组的第二列自增1,而且把后面那个二维数组的第一列设置为-1
* 再对这个新的二维数组进行遍历,当遇到第一列为-1的,则跳过,否则用一个新的二维数组接收这个二维数组
* 对新数组进行遍历,打印出来
* 对新二维数组的第二列进行排序打印出来
* 然后用二维数组的第一行的第二列元素去往下比较,打印出不比第一行第二列元素小的组
*/
public class CountNumber {
public static void main(String[] args) {
// TODO Auto-generated method stub
int [][] arr = new int [50][2];
//对50个二维数组的第一列进行随机数赋值
for(int i = 0; i < arr.length; i++) {
arr[i][0] = (int)(Math.random()*41+10);
}
//对50个二维数组的第二列赋值为1
for(int i = 0; i < arr.length; i++) {
arr[i][1] = 1;
}
//打印50个二维数组
/* for(int i = 0; i < arr.length; i++) {
System.out.print("{" + arr[i][0] + "," + arr[i][1] + "}");
}*/
//将数字重复出现的数组的第一列的数字赋值为-1,同时将第一次出现这个数字的数组的第二列自增1
for(int i = 0; i < arr.length; i++) {
if(arr[i][0] != -1) {
for(int j = i+1; j < arr.length; j++) {
if(arr[i][0] == arr[j][0]) {
arr[j][0] = -1;
arr[i][1]++;
}
}
}
}
//测试上一步操作是否成功
/* System.out.println(" ");
System.out.println("---------------------------------------");
for(int i = 0; i < arr.length; i++) {
System.out.print("{" + arr[i][0] + "," + arr[i][1] + "}");
}*/
//定义一个新的二维数组用来接收有效的旧二维数组
int[][] newArr = new int[arr.length][2];
int index = 0;
for(int i = 0; i < arr.length; i++) {
if(arr[i][0] != -1) {
newArr[index][0] = arr[i][0];
newArr[index][1] = arr[i][1];
index++;
}
}
//测试上一步操作是否成功
/* System.out.println(" ");
System.out.println("---------------------------------------");
for(int i = 0; i < newArr.length; i++) {
System.out.print("{" + newArr[i][0] + "," + newArr[i][1] + "}");
}*/
//由于新的二维数组是静态的,所以不能继续改变长度,为了美观,就继续用一个新的二维数组来接收上一个二维数组
int[][] newnewArr = new int [index][2];
for(int i = 0; i < newnewArr.length; i++) {
newnewArr[i][0] = newArr[i][0];
newnewArr[i][1] = newArr[i][1];
}
//测试上一步操作是否成功
/* System.out.println(" ");
System.out.println("---------------------------------------");
System.out.println("各个数字出现的个数如下");
for(int i = 0; i < newnewArr.length; i++) {
System.out.print("{" + newnewArr[i][0] + "," + newnewArr[i][1] + "}");
}*/
//按二维数组的第二列通过快速排序进行排序
for(int i = 0; i < newnewArr.length; i++) {
for(int j = i+1; j < newnewArr.length; j++) {
if(newnewArr[i][1] < newnewArr[j][1]) {
int temp = newnewArr[j][1];
newnewArr[j][1] = newnewArr[i][1];
newnewArr[i][1] = temp;
int temp1 = newnewArr[j][0];
newnewArr[j][0] = newnewArr[i][0];
newnewArr[i][0] = temp1;
}
}
//测试上一步操作是否成功
//将二维数组的第二列进行降序排列
/* System.out.println(" ");
System.out.println("---------------------------------------");*/
System.out.println("按数字次数排序");
for(int i = 0; i < newnewArr.length; i++) {
System.out.println("{数字:" + newnewArr[i][0] + "," + newnewArr[i][1] + "次}");
}
System.out.println(" ");
System.out.println("出现次数最多的数字与个数如下:");
//打印出出现次数最多的数字及其个数
for(int i = 0; i < newnewArr.length; i++) {
if(!(newnewArr[0][1] > newnewArr[i][1])) {
System.out.println("{数字:" + newnewArr[i][0] + "," + newnewArr[i][1] + "次}");
}
}
//通过冒泡排序将数组按数字升序排列
for(int i = 0; i < newnewArr.length - 1; i++) {
for(int j = 0; j < newnewArr.length-1 - i; j++) {
if(newnewArr[j][0] > newnewArr[j+1][0]) {
int temp = newnewArr[j][0];
newnewArr[j][0] = newnewArr[j+1][0];
newnewArr[j+1][0] = temp;
int temp1 = newnewArr[j][1];
newnewArr[j][1] = newnewArr[j+1][1];
newnewArr[j+1][1] = temp1;
}
}
//打印按数字升序排序后的结果
System.out.println("---------------------------------------");
System.out.println("每个数字及其出现次数如下");
for(int i = 0; i < newnewArr.length; i++) {
System.out.println("{数字:" + newnewArr[i][0] + "," + newnewArr[i][1] + "次}");
}
}
}
最后,上图,10个随机数,范围为:【10,15)
想的时间与做完的时间合起来起码有4个小时,虽然有点耗时间,不过,做完后感觉还是挺美妙的!Cool!
补充:因为将二维数组排序的时候,忘记将第一列与第二列联动修改了,所以导致结果有点怪,所以我又加了修改,当将二维数组的第一列排序时候,也要将第二列进行联动排序,同理,第二列排序,第一列也联动排序
最后,继续上图,这次就没问题了
修改版
在main方法使用循环
boolean flag = true;
while(flag) {
System.out.println("请输入您想要的数字个数:");
Scanner sc = new Scanner(System.in);
try {
int number = sc.nextInt();
if(number == 0) {
System.out.println("数组长度不能为0");
}else {
countNumber(number);
}
} catch(Exception e) {
System.out.println("不好意思,输入错误!");
}
System.out.println("是否继续?(输入1则继续,其他则退出)");
try {
int exit1 = sc.nextInt();
if(exit1 != 1) {
flag = false;
}
} catch(Exception e) {
System.out.println("输入错误!不让你走了,继续玩!");
}
}
然后将刚刚的那些功能搞成方法,如下
public static void countNumber(int length) {
int [][] arr = new int [length][2];
//对50个二维数组的第一列进行随机数赋值
for(int i = 0; i < arr.length; i++) {
arr[i][0] = (int)(Math.random()*5+10);
}
后面的省略,最后继续上图