当前位置: 代码迷 >> Java相关 >> 【史上最强JavaSE札记】之数组篇
  详细解决方案

【史上最强JavaSE札记】之数组篇

热度:88   发布时间:2016-04-22 20:51:04.0
【史上最强JavaSE笔记】之数组篇

 各位程序猿,各位攻城狮,各位蜥蜴鸥以及各位棕鲸鲤们~~大家好,我是潘师傅,欢迎大家收看由我为你们带来的【史上最强JavaSE笔记】系列,其实也可以叫【嘻哈JavaSE笔记】的,第一次在博客园发帖,想想还真是有点小激动呢,各位求支持呀,哈哈,那么回归正题,我把自己之前学习积累的笔记拿出来跟大家分享一下,方便大家更好的理解和复习,希望能够对大家有所帮助哈,这次发的是JavaSE方面数组篇的,内容不一定全面哦,欢迎大家前来留言交流哈,不足的地方还望大家多多指出和指导哈~(由于首次发文章,布局可能比较乱,不美观,还望大家多多指导)。

1.数组声明:
 
 
第一种:数据类型 变量名[],例如:int x[];
 
第二种:数据类型[] 变量名=new 数据类型[要在内存中开辟的空间数量,例如:int[] x=new int[3];
 
第三种:数据类型[] 变量名=new 数据类型[]{元素1,元素2,元素3};
 
例子1:
 
 1 public static void main(String[] arg){ 2  3        //定义一个字符串数组,将各个元素(也就是月饼)放入其中 4  5        String[]names={"五仁月饼","香辣牛肉月饼","金嗓子月饼","韭菜月饼"}; 6  7         8  9        //通过for循环遍历一下数组,通过输出语句判断循环输出10 11        //names.length是数组的长度,names是输出数组下标为i的元素名称12 13        for(int i = 0;i<names.length;i++){14 15            System.out.println("我吃到第"+(i+1)+"个月饼是"+names);16 17        }18 19 }

 

输出结果:
 
我吃到第1个月饼是五仁月饼
我吃到第2个月饼是香辣牛肉月饼
我吃到第3个月饼是金嗓子月饼
我吃到第4个月饼是韭菜月饼
 
2.数组常见的异常(2种)
原因:数组没有分配内存空间
 1 public static void main(String[] args) { 2  3        //空指针异常 4  5        //错误提示:NullPointerException 6  7        String[]names=null; 8  9        System.out.println(names[1]);10 11 }

 

输出结果:
 
    ata2.NullPointerException(a2.java:10)
    ata2.main(a2.java:5)
 
2.数组越界异常
原因:下标超出了数组长度
 1 public static void main(String[] args) { 2  3        //数组越界异常 4  5        //ArrayIndexOutOfBoundsException 6  7        String[]names={"五仁月饼","香辣牛肉月饼","金嗓子月饼","韭菜月饼"}; 8  9        System.out.println(names[4]);10 11 }

 

输出结果:
 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:4
    ata3.main(a3.java:5)
 
 
3.数组内存结构分析
 
栈内存和堆内存的区别:
 
数组内存分为 栈内存 和 堆内存。
 
栈内存 中是用来存放变量名的,存放确定大小的,存的是一个内存地址,通过它可以从堆内存中找到其对应的值,存取速度比堆内存快,例如:names
 
堆内存 中用来存放值的,存放不确定大小的,需要动态代码运行到这一句才会确定大小,例如:"小明"
 
4.多维数组
 
习题:3个班级各4名学员参赛,计算每个班的平均成绩
 1 public static void main(String[] args) { 2        //创建一个键盘输入 3        Scannerinput = newScanner(System.in); 4        //定义一个scores二维数组,第一个存班级数量,第二个存学生数量 5        int scores[][]=new int[3][4]; 6        //遍历,将输入的成绩存入到二维数组scores中 7        for (int i = 0; i < 3; i++) { 8            for (int j = 0; j < 4; j++) { 9               System.out.println("请输入第"+(i+1)+"个班级的第"+(j+1)+"个同学的成绩:");10               scores[j]=input.nextInt();11            }12        }13       14        //输出二位数组的每个元素15        for (int i = 0; i < 3; i++) {16            System.out.println("第"+(i+1)+"个班级的学员成绩:");17            int sum = 0;18            for (int j = 0; j < 4; j++) {19               System.out.println("第"+(j+1)+"个学员的成绩是:"+scores[j]);20               sum+=scores[j];21            }22            System.out.println("第"+(i+1)+"个班级的平均分是:"+(sum/4));23        }24     }

 

输出结果:
 
请输入第1个班级的第1个同学的成绩:
61
请输入第1个班级的第2个同学的成绩:
71
请输入第1个班级的第3个同学的成绩:
85
请输入第1个班级的第4个同学的成绩:
92
请输入第2个班级的第1个同学的成绩:
64
请输入第2个班级的第2个同学的成绩:
73
请输入第2个班级的第3个同学的成绩:
95
请输入第2个班级的第4个同学的成绩:
66
请输入第3个班级的第1个同学的成绩:
35
请输入第3个班级的第2个同学的成绩:
73
请输入第3个班级的第3个同学的成绩:
83
请输入第3个班级的第4个同学的成绩:
94
1个班级的学员成绩:
1个学员的成绩是:61
2个学员的成绩是:71
3个学员的成绩是:85
4个学员的成绩是:92
1个班级的平均分是:77
2个班级的学员成绩:
1个学员的成绩是:64
2个学员的成绩是:73
3个学员的成绩是:95
4个学员的成绩是:66
2个班级的平均分是:74
3个班级的学员成绩:
1个学员的成绩是:35
2个学员的成绩是:73
3个学员的成绩是:83
4个学员的成绩是:94
3个班级的平均分是:71
 
优化思考:成绩为0-100分,如何在录入成绩的时候保证不录入错误呢?
 
分析:写入判断,如果输入的成绩大于100或者小于0,那么就提示错误,可以重新对该同学的成绩进行输入。
 1 public static void main(String[] args) { 2        Scannerinput = newScanner(System.in); 3        int scores[][] = new int[3][4]; 4        for (int i = 0; i < 3; i++) { 5            for (int j = 0; j < 4; j++) { 6               System.out.println("请输入第"+(i+1)+"个班级的第"+(j+1)+"个同学的成绩:"); 7               scores[j]= input.nextInt(); 8               if (scores[j] > 100|| scores[j] < 0) { 9                   10                   System.out.println("输入成绩无效,成绩为0-100分,请重新输入");11                   //方法1:通过j--将这次循环记录删除,这样下次循环就会再循环到这个同学的成绩输入12                   j--;13                   //方法2:在没有跳出循环的情况下再次输入一次14                   //System.out.println("请输入第"+(i+1)+"个班级的第"+(j+1)+"个同学的成绩:");15                   //scores[j] = input.nextInt();16               }17               18            }19        }20       21        for (int i = 0; i < 3; i++) {22            System.out.println("第"+(i+1)+"个班级同学成绩:");23            int sum = 0;24            for (int j = 0; j < 4; j++) {25               System.out.println("第"+(j+1)+"个同学的成绩为:"+scores[j]);26               sum+=scores[j];27            }28            System.out.println("第"+(i+1)+"个班级的平均成绩为:"+(sum/4));29            System.out.println("---------------------------------------------");30        }31     }

 

练习题:
 
1.猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数。
 1 public static void main(String[] args) { 2        int num[] ={3,5,7,83,23,64}; 3        boolean flag = false; 4        Scannerscan = newScanner(System.in); 5        System.out.println("猜数字游戏"); 6        System.out.println("请输出一个数字:"); 7        int input = scan.nextInt(); 8        for (int i = 0; i < num.length; i++) { 9            if (num == input) {10               flag= true;11               break;12            }13        }14        if (flag) {15            System.out.println("恭喜您猜对了~");16        }else{17            System.out.println("很遗憾,您猜错了~");18        }19     }

 

2.使用字母打印正三角形.
      A
     BBB
    CCCCC
   DDDDDDD
  EEEEEEEEE
 FFFFFFFFFFF
GGGGGGGGGGGGG
 1 public static void main(String[] args) { 2        char[] sj = {'A','B','C','D','E','F','G'}; 3        //打印的行数 4        for (int i = 0; i < sj.length; i++) { 5            //打印每行的空格数量 6            for (int j = i; j < sj.length - 1; j++) { 7               System.out.print(" "); 8            } 9            //打印每行的字母数量10            for (int j = 0; j <= i * 2;j++) {11               System.out.print(sj);12            }13            System.out.println();14        }15     }

 

3.求数组中的最大值最小值。
  
 1 public static void main(String[] args) { 2         int num[] = { 3, 29, 33, 6, 90, 24, 50 }; 3         int max = num[0]; 4         int min = num[0]; 5         for (int i = 0; i < num.length; i++) { 6             if (num[i] > max) { 7                 max = num[i]; 8             } 9             if (num[i] < min) {10                 min = num[i];11             }12         }13         System.out.println("数组中的最大值为:" + max);14         System.out.println("数组中的最小值为:" + min);15     }  

 

4.有一串数字:748,520,998,1001,250,512,502,使用冒泡排序分别对其进行由小到大,由大到小的排列起来。
 
 1 public static void main(String[] args) { 2        int num[] ={748,520,998,1001,250,512,502}; 3        int temp; 4        for (int i = 0; i < num.length - 1; i++) { 5            for (int j = 0; j < num.length - 1 - i; j++) { 6               if (num[j] > num[j +1]) {//>是从小到大排,<是从大到小排 7                   temp= num[j]; 8                   num[j]= num[j + 1]; 9                   num[j+ 1] = temp;10               }            11            }         12        }13        System.out.println("积分榜排名为:");14        for (int i = 0; i < num.length; i++) {15            System.out.print(num + " ");16        }17     }

 

实战应用案例:
 
双色球彩票程序
 
  1 /**  2 * 应用案例:模拟双色球彩票程序  3 * 实现步骤:  4 * 1.系统生成一个篮球和6个红球,并存储起来  5 * 2.接受用户选号,1个篮球和6个红球  6 * 3.验证系统号码与用户号码是否匹配(是否中奖)  7 * 4.公布本期中奖号码  8 */  9 双色球彩票规则: 10 一等奖:500万,1个蓝球,6个红球 11 二等奖:一等奖的30%,6个红球 12 三等奖:3000元,1个蓝球,5个红球 13 四等奖: 200元,5个红球或者1个蓝球,4个红球 14 五等奖:10元,4个红球或者1个蓝球,3个红球 15 六等奖:5元,1个蓝球 16 程序代码如下: 17 public static void main(String[] args) { 18        int sysBlue;                //系统生成的1个蓝球号 19        int[] sysRed = new int[6];      //系统生成的6个红球号 20        int userBlue;               //用户输入的1个蓝球号 21        int[] userRed = new int[6];     //用户输入的6个红球号 22        23        int blueball = 0;           //正确的蓝球个数 24        int redball = 0;            //正确的红球个数 25        26        Randomr = newRandom();    //随机函数 27        Scannerinput = newScanner(System.in);//键盘输入 28        29        //红球所有的33个号 30        int[] redNum ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32}; 31        32        //系统随机在1-16中生成蓝球号 33        sysBlue= r.nextInt(16)+1; 34        35        //随机生成的红球号码 36        for (int i = 0; i < sysRed.length; i++) { 37            while(true){ 38               int index = r.nextInt(33);      //随机生成0-32的下标 39               if (redNum[index] != 0) {       40                   sysRed= redNum[index]; 41                   redNum[index]= 0; 42                   break; 43               } 44            } 45        } 46        47        System.out.println("双色球彩票选号开始啦~"); 48        System.out.println("请选择篮球号码(16选1):"); 49        userBlue= input.nextInt(); 50        System.out.println("请选择红球号码(33选6):"); 51        for (int i = 0; i < userRed.length; i++) { 52            userRed= input.nextInt(); 53        } 54        55        //验证篮球和红球的正确个数 56        //---------验证篮球 57        if (userBlue == sysBlue) { 58            blueball= 1; 59        } 60        61        //---------验证红球 62        for (int i = 0; i < userRed.length; i++) { 63            for (int j = 0; j < sysRed.length; j++) { 64               if (userRed ==sysRed[j]) { 65                   redball++; 66                   break; 67               } 68            } 69        } 70        71        //判断是否中奖 72        if (blueball == 1&& redball == 6) { 73            System.out.println("恭喜你,中了一等奖500万!"); 74        }else if(redball == 6){ 75            System.out.println("恭喜你,中了二等奖"); 76        }else if(blueball == 1&& redball == 5){ 77            System.out.println("恭喜你,中了三等奖,3000元"); 78        }else if(redball == 5 ||(blueball == 1 && redball == 4)){ 79            System.out.println("恭喜你,中了四等奖,200元"); 80        }else if(redball == 4 ||(blueball == 1 && redball == 3)){ 81            System.out.println("恭喜你,中了五等奖,10元"); 82        }else if(blueball == 1){ 83            System.out.println("恭喜你,中了六等奖,5元"); 84        }else{ 85            System.out.println("很遗憾,您没有中奖~~继续加油~~╮(╯▽╰)╭"); 86        } 87        88        //公布本期中奖号码 89        int temp; 90        for (int i = 0; i < sysRed.length-1; i++) { 91            for (int j = 0; j < sysRed.length-1-i; j++) { 92               if (sysRed[j] >sysRed[j+1]) { 93                   temp= sysRed[j]; 94                   sysRed[j]= sysRed[j+1]; 95                   sysRed[j+1] = temp; 96               } 97            } 98        } 99       100        System.out.println("本期的中奖号码为:");101        System.out.println("红球:");102        for (int i = 0; i < sysRed.length; i++) {103            System.out.println(sysRed+" ");104        }105        System.out.println();106        System.out.print("篮球:" + sysBlue);107 108     }109  

 

1楼ohmygirl
quot;最强quot;--有点过了。嘻嘻哈哈的气氛倒是挺好。
Re: ITMusicBoy潘师傅
@ohmygirl,0. 0哈哈~~谢谢评价~~我一定会努力改进做更多的优化的~~希望能够帮助更多的朋友通过笔记的轻松嘻嘻哈哈的方式来学习到Java~~