一、数组特点:
- 数组中的每一个数据元素都属于同一数据类型
- 元素是基本类型,系统将默认规则赋初值元
- 素类型是引用类型,则其所有元素为未赋初值状态(null)
- 元素存储有先后顺序,属于构造数组类型
- 一旦声明了数组大小就不能更改,数组的长度是固定不变的
二、声明数组:
1.一维数组:
格式1: 数组元素类型 数组名[] ;
格式2: 数组元素类型[] 数组名 ;
2.二维数组
格式1: 数组元素类型 数组名[][] ;
格式2: 数组元素类型[] []数组名 ;
三、一维数组赋值的三种方法
1.声明数组并分配空间
int [] nums1=new int[3];
nums1[0]=1;//数组下标
nums1[1]=2;
nums1[2]=3;
2.声明数组分配空间并赋值
int [] nums2=new int[]{1,2,3};
3.声明数组并赋值
int [] nums3={1,2,3};
四.二维数组赋值,创建空间
二维数组看作是数组的数组,不要求二维数组每一维的大小相同
1.直接为每一维分配空间
int a[][]=new int[2][3] ; //两行三列
2.从最高维开始,按由高到低的顺序分别为每一维分配空间
int a[][]=new int [2][]; //先确定有两行,但是每一行有多少列不确定
a[0]=new int[3];//第一行有3列
a[1]=new int[4];//第二行有4列
//可以利用此方式动态创建二维数组
数组长度
int n=nums1.length;
打印输出数组中的值
for (int i=0;i<n;i++){
System.out.print(nums[i]);
}
特殊for循环
// for (元素类型 循环变量名 : 数组名) { 循环体 }
for(int item:nums){System.out.print(item);}
Arrays类:封装了对数组进行操作的一系列静态方法。
sort方法可方便地对数组排序:java.util.Arrays.sort(nums);
toString()方法可以将数组转化为字符串的形式:System.out.print( java.util.Arrays.toString(nums) );
数组应用:冒泡排序,二叉树排序,选择排序,快速排序
五、示例
示例1:编写并验证如下方法:
1) 对一维数组进行从大到小排序。
2) 求一维数组所有元素的平均值。
3) 查找某个数据在数组中的出现位置。
解题思路:
1) 先定义一个一维数组
2) 提供排序方法,注意传递参数为数组时,是引用传递,因此在排序方法中修改值,会影响到原本的一维数组,因此可以使用clone()方法,只是复制值
3) 提供一个求平均值的方法,依次遍历求和,记得平均值精度,float
4) 查找数据下标,遍历是否存在,然后查下标
程序代码:
import java.util.Scanner;
/**
* 编写并验证如下方法:
* (1)对一维数组进行从大到小排序。
* (2)求一维数组所有元素的平均值。
* (3)查找某个数据在数组中的出现位置。
*/
public class ArraysOpt {
public static void main(String[] args) {
int[] nums = {77, 6, 8, 9, 6, 5, 4, 8, 3};//一维数组
System.out.println("arrays:");
for (int item : nums
) {
System.out.print(item + "\t");
}
//(1)从大到小排序。
sortByDesc(nums.clone());//不影响原本数组的排序
//(2)求一维数组所有元素的平均值。
System.out.println("\navg:"+getAvg(nums));
//(3)查找某个数据在数组中出现的位置
System.out.println("\n请输入需要查找的数");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
findIndex(nums, n);
}
private static float getAvg(int[] nums) {
int sum=0;
for (int num : nums
) { sum+=num;
}
return (float)sum/nums.length;
}
private static void findIndex(int[] nums, int n) {
//查找某个数据在数组中出现的位置
int index = -1;//先假设该数据不存在
for (int k = 0; k < nums.length; k++) {
if (nums[k] == n) {
index = k;//若存在,则下标
break;
}
}
if (index != -1) {
System.out.print(n + "所在下标为" + index);
} else
System.out.print("该数据不存在");
}
private static void sortByDesc(int[] nums) {
//利用冒泡排序
for (int i = 0; i < nums.length - 1; i++) {
for (int j = 0; j < nums.length - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
System.out.println("\nBy Desc:");
for (int item : nums
) {
System.out.print(item + "\t");
}
}
}
运行结果:
示例2:幻方是一个奇数阶矩阵,每个元素值不同,且它的每一行之和、每一列之和、左对角线之和以及右对角线之和都等于一个相同的数。编写一个程序验证输入的3阶矩阵是否为幻方。一下为两组验证数据。
4 9 2 49 113 17
3 5 7 29 59 89
8 1 6 101 5 71
解题思路:
- 此处判断3阶矩阵,即3行3列,因此用二维数组存储更恰当
- 先默认输入矩阵为幻方,再根据条件一个一个的排除,来证明猜想
- 每个元素值不同:循环判断元素值,如果全部相同则为flase,元素值不重复,考虑HashSet
- 和相等:先判断两个对角线和是否相等,若不等则为flase;若对角线和相等,则保存和值s,再把列和/行和与s相比较,任意一个若不等,则为false
- 若都通过了前面的条件,说明该幻方即为true,猜想成立
程序代码:
import java.util.HashSet;
import java.util.Scanner;
/**
* 幻方是一个奇数阶矩阵,每个元素值不同,
* 且它的每一行之和、每一列之和、左对角线之和以及右对角线之和都等于一个相同的数。
* 编写一个程序验证输入的3阶矩阵是否为幻方。一下为两组验证数据。
* 4 9 2 49 113 17
* 3 5 7 29 59 89
* 8 1 6 101 5 71
*/
public class Matrices {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int[][] nums = new int[3][3];//存放在二维数组
System.out.println("请输入矩阵(3*3):");
//确定次数用for循环
for (int i = 0; i < 3; i++) {//二维,双重循环
for (int j = 0; j < 3; j++) {
nums[i][j] = input.nextInt();
}
}
boolean flag = true;//先默认是幻方
//判断元素值是否不等
HashSet<Integer> hashSet = new HashSet<Integer>();//hashSet不包含重复元素的集合。
for (int i = 0; i < 3; i++) {//二维,双重循环
for (int j = 0; j < 3; j++) {
hashSet.add(nums[i][j]);//把数组元素存入hashset,并且不存入多余重复的值
}
}
if (flag=(hashSet.size()== 9)) {
//先把对角线和求出
int sum1 = nums[0][0] + nums[1][1] + nums[2][2];
int sum2 = nums[0][2] + nums[1][1] + nums[2][0];
if (sum1 != sum2) {//先判断对角线和是否相等
flag = false;
} else {
int s = sum1;//如果相等,保存和值
for (int i = 0; i < 3; i++) {
sum1 = 0;
sum2 = 0;
for (int j = 0; j < 3; j++) {
sum1 += nums[i][j];//计算每一行之和
sum2 += nums[j][i];//计算每一列之和
}
if (s != sum1 || s != sum2) {//判断行,列,对角线是否相等
flag = false;
break;
}
}
}
}
System.out.println("是否为幻方:" + flag);
}
}
运行结果:
示例3:动态创建二维数组
打印杨辉三角:第0列和对角线上的元素均为1,其他元素的值均为上一行的同列元素和前一列元素之和
方法1:使用普遍方法实现
private static void triangle1() {
//Yang Hui triangle 杨辉三角
//第0列和对角线上的元素均为1,其他元素的值均为上一行的同列元素和前一列元素之和;
int[][] nums = new int[10][10];
int i, j;
for (i = 0; i < 10; i++) {
nums[i][0] = 1;//第0列
nums[i][i] = 1;//对角线
}
//从第三行第二列开始赋值,第几行就有几列
for (i = 2; i < 10; i++) {
for (j = 1; j < i; j++) {
nums[i][j] = nums[i - 1][j] + nums[i - 1][j - 1];
}
}
//打印格式,第几行就有几列
for (i = 0; i < 10; i++) {
for (j = 0; j <= i; j++) {
System.out.print("\t" + nums[i][j]);
}
System.out.println("\n");
}
}
方法2:使用动态创建二维数组实现
private static void triangle2() {
int[][] nums = new int[10][];
for (int i = 0; i < 10; i++) {
nums[i] = new int[i + 1];//初始化第二层数组的大小
//Java语言中的二维数组其实是每个元素都是一个一维数组的一维数组,所以第二维的长度可以任意
for (int j = 0; j <= i; j++) {
if (i == 0 || j == 0 || j == i) {
nums[i][j] = 1;
} else {
nums[i][j] = nums[i - 1][j] + nums[i - 1][j - 1];
}
System.out.print(nums[i][j] + "\t");
}
System.out.println();
}
}
运行结果: