Java基础-数组:猜字母数字

来源:互联网 发布:linux 重新安装lnmp 编辑:程序博客网 时间:2024/06/05 07:36

这是我个人写的第一个博客吧。分享下我的学习java路程。

先介绍下java数组的概念:

数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。

1.数组可以装一组数,必须类型相同
2.数组按线性顺序,一个跟一个
3.数组也是一种数据类型
4.数组new之后,数组中的每个元素都有一个默认值
    整数:0  浮点数:0.0  boolean:false

1)数组的定义:
    int[] arr = new int[4]; //每个数都是0
2)数组的初始化

int[] arr;  //声明数组    arr = new int[4];  //初始化    int[] arr = {1,5,8,3}; //只能声明同时初始化    int[] arr = new int[]{1,5,8,3};    int[] arr;    arr = {1,5,8,3}; //错误
3)数组的访问:通过下标
    下标从0开始
    int[] arr = new int[4];    System.out.println(arr.length);//数组的长度4    arr[0] = 55;//给arr中的第1个数赋值为55    arr[4] = 99; //错误,数组越界,最大到3    System.out.println(arr[2]);//输出第3个数

4)数组的遍历

    //遍历数组    int[] arr = {1,8,5,3};    for(int i=0;i<arr.length;i++){  //正序       System.out.println(arr[i]);    }    for(int i=arr.length-1;i>=0;i--){  //倒序       System.out.println(arr[i]);    }

数组的内存分配机:

//让books数组变晕、 strArr数组变量指向names所引用的数组books e names; 
books = names;strArr = names;System.out.println( ”-----------…”);”System.out.println( ”books数组的长度3 + books. length); System.out.println( ”strArr数组的*度: " + strArr.length); //改变books数组变量所引用的数组的第2个元素值。books[ll = ”唐僧” ;System. out. println ( ” names数缝的第2个元素是z ” +books(l]);

上面程序中粗体字代码将让books 数组变量、strArr 数组变量都指向nam臼数组变量所引用
的数组,这样做的结果就是books、strArr、nam由这3 个变量引用同一个数组对象。此时, 3 个
引用变量和数组对象在内存中的分配如图所示。


从图中可以看出, 此时strA町、nam白和book 数组变量实际上引用同一个数组对象。因此, 当访问books 数组、strArr 数组的长度时, 将看到输出3。这很容易造成一个假想: books数组的长度从4 变成了3. 实际上, 数组对象本身的长度并没有发生改变, 变的是books 数组变量. books 数组变量原本指向堆内存下面的数组, 当执行了booksnam白,语句之后, books 数组将改为指向堆内存中间的数组,而原来books 变量所引用的数组的长度依然是4.当然,从图中还可以看出, 原来books 变盘所引用的数组长度然是4, 但不再有任何引用变量引用该数组,因此它将会变成垃圾, 等着垃圾回收机制来回收。此时, 程序使用books 、name部和strArr 这3 个变量时,将会访问同一个数组对象,因此把books 数组的第2 个元素赋值为“唐僧” 时, nam臼数组的第2 个元素的值也会随之改变。

PS:使用Java数组之前必须先 初始化数组,也就是为数组元素分配内存空间,并指定初始值。实际上,如果真正掌握了Java数 组在内存中分配机制,那么完全可以换一个方式来初始化数组,或者说,数组无需经过初始化。
始终记住:Java的数组变量是引用类型的变量,它并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中即可使用该数组变量。

下面是我自己根据一些资料来写的一个猜字母小游戏。

import java.util.Scanner;public class Guessing {public static void main(String[] args) {// TODO Auto-generated method stubScanner scan = new Scanner(System.in);int level;do {System.out.println("请输入您选择的游戏等级:5、7、9");level =scan.nextInt();}while(level!=5 && level !=7 && level !=9);char [] chs = generate();//获取随机数组System.out.println(chs);int count = 0;while (true) {System.out.println("请猜题");String str = scan.next().toUpperCase();//不区分大小写,总动转换大小写字母if(str.equals("exit")) {//如果用户刚开始游戏就想退出的话,输入exit即可退出System.out.println("下次再来玩吧!");break;}char [] input = str.toCharArray();//讲用户输入的字符串转换成字符数组int [] result =check(chs,input);if(result[0]== chs.length) {//猜对了int score =chs.length*100-10*count;System.out.println("恭喜你,猜对了,得分为"+score);break;}else {count++;System.out.println("猜对的字符个数"+result[1]+"猜对的位置个数"+result[0]);}}}//随机生成字符组;public static char [] generate(){//这里呢用了一种间接方法,利用创建随机数字来对应26字母,char数组的下标char [] chs =new char [5];//随机字符数组;char [] letters = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};boolean[] flags = new boolean[letters.length];//开关数组,默认为falsefor(int i =0;i<chs.length;i++) {int index;//随机下标do { index = (int)(Math.random()*26);}while (flags[index]==true);chs [i] = letters[index];flags[index] = true;//修改下标,为true}return chs;}//对比:随机数组与用户输入数组作对比public static int[] check(char[] chs,char[] input) {int[] result = new int[2];//对比结果resultfor(int i =0;i<chs.length;i++) {//遍历随机数组for(int j = 0;j<input.length;j++) {//遍历用户输入数组if(chs[i] == input [j]) {//字符对result [1]++;//字符对个数+1if(i == j) {//位置对result[0]++;//位置对个数+1}break;//与input匹配后,不再和input剩下字符比较}}}return result;}}


原创粉丝点击