java第二节课

数组

是一组相同数据类型元素的集合 , 是一个容器数组中可以存储基本数据类型,也可以存储引用数据类型数组创建时必须指定长度,创建后,长度不能改变数组中每个元素空间是连续的。

一维数组:

数组的声明和创建:

int[] a,d;
int b[], c;

两种都可以,但是一般运用第一种表明a,b都是数组。

int[] a = new int[5];  //new 创建一个数组,并指定数组的长度(容量), 每个空间会赋予默认值  整数默认值是0

System.out.println(Arrays.toString(a));//[0, 0, 0, 0, 0] toString(a) 把数组以字符串的形式返回,便于调试查看

String[] strings = new String[5];
System.out.println(Arrays.toString(strings));//[null, null, null, null, null]  引用类型默认值都是null

 boolean[] d = new boolean[5];
 System.out.println(Arrays.toString(d)); //[false, false, false, false, false]  boolean类型默认值是false

访问数组:

访问数组中的元素

数组名[索引/下标]

索引/下标:
从0开始
是整数(int),数组长度最大值就是int的最大值

数组下标越界异常

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1at day1.Demo2.main(Demo2.java:21)

数组的长度:

1.数组名.length(求数组长度)

System.out.println(a.length);

for循环遍历数组
int[] a = new int[]{1,2,3,4,5};
for (int i = 0; i < a.length; i++) {
      System.out.println(a[i]);
}

2.数组元素最大值Integer.MAX_VALUE
int [] a = new int[Integer.MAX_VALUE+1];(这样就超出了数组的最大值不可以定义数组)
System.out.println(Arrays.toString(a));(会显示失败)
增强for循环(意思就是将一个数组从头走到尾部的过程)
int[] a =new int[]{0,1,2,3,4,5,6};
for(int t : a){
    System.out.println(t);
}

数组的排序

1.冒泡排序

冒泡排序
每次取出相邻的两个元素进行比较,将最大的元素放在最后,每比较一趟,可以得到一个最大值
例如:5,4,3,2,1->4,3,2,1,5->3,2,1,4,5->2,1,3,4,5->1,2,3,4,5
int a [] = new int[]{5,4,3,2,1};
        for (int i = 0; i < a.length; i++) {//外层(总共)循环次数
            for (int j = 0; j < a.length-1-i; j++) {//内层循环次数(-1:是因为要将j 和 j+1 进行比较 不减1的话就会超出a数组的范围)(-i:是忽略已经固定的最大值的元素)
                if (a[j] > a[j + 1]) {
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }

2.选择排序

选择排序
 从第一个元素开始,将较小的元素移动到第一个位置,以此类推
例如:5,4,3,2,1->1,5,4,3,2->1,2,5,4,3->1,2,3,5,4->1,2,3,4,5
int a[] ={5,4,3,2,1};
        for (int i = 0; i < a.length; i++) {
            for (int j = i+1; j < a.length; j++) {//比较大小直接交换
                if(a[i]>a[j]){
                    int temp = a[j];
                    a[j] = a[i];
                    a[i] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(a));

选择排序的优化

int a[] ={5,4,3,2,1};
for (int i = 0; i < a.length; i++) {//记录位置
            int min = i;
            for (int j = i+1; j < a.length; j++) {//记录位置然后交换(避免多次交换)
                if(a[min]>a[j]){
                    min = j;
                }
            }
            int temp = a[i];
            a[i] = a[min];
            a[min] = temp;
        }
        System.out.println(Arrays.toString(a));

二维数组:

二维数组(多维数组):数组的数组,数组中的每一个元素又是一个一维数组

int [][] a = new int[][]{{0,1,2,3,4},{0,1,2,3,4}{0,1,2,3,4}};

int [][] a ={{0,1,2,3,4},{0,1,2,3,4}{0,1,2,3,4}};

int [][] a = new int[3][5];

[3]:二维长度的数组的长度为3

[5]:二维数组中,每一个一维数组的长度为5

{{0,1,2,3,4},{0,1,2,3,4}{0,1,2,3,4}}

int [][] a = new int[3][];

[3][]:只声明了二维数组的长度是3,并没有声明二维数组中的一维数组长度,也就不会创建一维数组

{NULL,NULL,NULL}后续应该按如下写

 

数组的声明及创建:

int [][] a = new int[][]{{0,1,2,3,4},{0,1,2,3,4}{0,1,2,3,4}};

int [][] a ={{0,1,2,3,4},{0,1,2,3,4}{0,1,2,3,4}};

int [][] a = new int[3][5];

[3]:二维长度的数组的长度为3

[5]:二维数组中,每一个一维数组的长度为5

{{0,1,2,3,4},{0,1,2,3,4}{0,1,2,3,4}}

特殊:

int [][] a = new int[3][];

[3][]:只声明了二维数组的长度是3,并没有声明二维数组中的一维数组长度,也就不会创建一维数组其内容是{NULL,NULL,NULL}

后续应该按如下写

a[0] = new int[10];

a[1] = new int[10];

a[2] = new int[10];

数组的遍历:

int [][] a ={{1,2,3},{4,5,6},{7,8,9}};

for (int i = 0; i < a.length; i++) {

for (int j = 0; j < a[i].length; j++) {

System.out.println(a[i][j] + "\t"); }

练习:

数组内容最主要的还是练习,主要有两个练习

1.杨辉三角:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int a [][] = new int[n][2*n+1];
        a[0][n] = 1;
        for (int i = 1; i < a.length ; i++) {
            for (int j = 1; j <a[i].length-1 ; j++) {
                    a[i][j] = a[i-1][j-1] + a[i-1][j+1];
            }
        }
        for (int i = 0; i <a.length ; i++) {
            for (int j = 0; j <a[i].length - 1 ; j++) {
                if(a[i][j] != 0){
                    System.out.print(a[i][j] + "\t");
                }
                System.out.print("\t");
            }
            System.out.println();
        }
    }

2.五子棋

import java.util.Scanner;

/*
 * 五子棋
 */
public class WZQ {

		/*
		  1.提供一个启动五子棋游戏的方法
		      初始化棋盘方法
		      打印棋盘方法
		  2.开始下棋,黑白棋交替下棋

		  3.判断坐标是否合法,是否重复

		  4.判断输赢
		*/
	    static String white = "☆";
	    static String black = "★";
	    static String[][] qp = new String[15][15]; //{{null,null}}
	    static String[] num = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
	    static String line = "十";
	    static boolean flag = true; //true--黑棋下子,false--白棋下子
    	static Scanner scanner = new Scanner(System.in);

	    //启动五子棋游戏
        public static void startGame(){
			init();
			print();
            play();
		}

		 //开始下棋
	     public static void play(){
			 System.out.println("欢迎开到五子棋游戏");

        	 while (true){
                 if(flag){
					 System.out.println("黑棋下子");
					 System.out.println("输入行:");
					 int r = scanner.nextInt()-1; //行 ,二维数组的索引
					 System.out.println("输入列:");
					 int c = scanner.nextInt()-1;//列 , 一维数组索引
                     //判断是否越界(合法),判断是否重复
					  boolean res = check(r,c);
					  if(res){
					  	   qp[r][c] = black;//真正的落子
					  	   print();//打印
 						  //判断输赢  赢了终止循环
						  boolean iswin = isWin(r,c,black);
						  if(iswin){
							  System.out.println("黑棋胜利");
							  break;
						  }
						  flag = false;
					  }else{
						  System.out.println("坐标越界或者重复");
					  }
				 }else{
					 System.out.println("白棋下棋");
					 flag = true;
				 }
			 }
		 }

		 //判断输赢
	     public static  boolean isWin(int r,int c,String qz){
        	//水平判断输赢
			 int spsum = 1;
            //水平向左找 
			 for (int leftc = c-1; leftc>=0; leftc--) {
				 if(qp[r][leftc]==qz){
				 	spsum++;
				 }else{
                       break;
				 }
			 }
			 if(spsum==5){
			 	return true;
			 }
			 //水平向右找
			 for (int rightc = c+1; rightc < qp[0].length-1; rightc++) {
				 if(qp[r][rightc]==qz){
					 spsum++;
				 }else{
					 break;
				 }
			 }
			 if(spsum==5){
				 return true;
			 }

        	return false; //true-胜利  false-没有胜利
		 }

		 //判断是否越界(合法),判断是否重复
		 public static boolean check(int r,int c){
        	if(r<0||c<0||r>qp.length||c>qp[0].length){//判断是否越界
        		return false;
			}
        	if(qp[r][c]!=line){//判断是否重复
        		return false;
			}
        	return true;
		 }

		//初始化棋盘
		public static void init(){
			for (int i = 0; i < qp.length ; i++) {
				for (int j = 0; j < qp[i].length; j++) {
					 qp[i][j] = line;
					 if(j==qp[i].length-1){
						 qp[i][j] = num[i];
					 }
					 if(i==qp.length-1){
						 qp[i][j] = num[j];
					 }
				}
			}
		}

		//打印棋盘
		public static void print(){
			for (int i = 0; i < qp.length ; i++) {
				for (int j = 0; j < qp[i].length; j++) {
					System.out.print(qp[i][j]);
				}
				System.out.println();
			}
		}

}

 

这是主要思想同学们可以先自行编辑,后续可以找我私信或者在评论区回复我都会一一发送压缩代码包。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值