数组
是一组相同数据类型元素的集合 , 是一个容器数组中可以存储基本数据类型,也可以存储引用数据类型数组创建时必须指定长度,创建后,长度不能改变数组中每个元素空间是连续的。
一维数组:
数组的声明和创建:
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();
}
}
}
这是主要思想同学们可以先自行编辑,后续可以找我私信或者在评论区回复我都会一一发送压缩代码包。