java数组的学习
数组
- 数组是相同类型数据的有序集合
- 数组描述的是相同类型的若干个数据,按照一定的先后顺序排列组合而成
- 里面的每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问他们
public class ArrayDemo01 {
public static void main(String[] args) {
// 变量的类型 变量的名字 = 变量的值
int[] nums; // 声明了一个int类型的数组
nums = new int[10]; // 创建了一个数组
for (int i = 0; i < nums.length; i++) {
nums[i] = i+1;
System.out.print(nums[i]+"\t");
}
}
}
输出结果:
1 2 3 4 5 6 7 8 9 10
数组特点:
- 长度是确定的,大小不可以改变
- 元素必须是相同类型
- 元素可以是任何数据类型,包括基本类型和引用类型
- 数组变量属于引用类型,数组本身就是对象,Java中对象是在堆中的,所以数组对象本身实在堆中的
数组长度是array.length,所以下标最大为array.length-1,如果超出,会报错:.ArrayIndexOutOfBoundsException:数组下标越界异常
数组使用
demo04
- 普通的for循环
- for-each循环
- 数组作方法入参
- 数组作为返回值
public class ArrayDemo04 {
public static void main(String[] args) {
// 声明一个数组
int[] arrays = {1, 3, 4, 5, 6,};
// jdk1.5 没有下标
// for-each 循环
for (int array : arrays) {
System.out.println(array);
}
// 方法的使用
printArray(arrays);
int[] reverse = reverseArray(arrays);
printArray(reverse);
}
// 数组作方法入参
public static void printArray(int[] arrays) {
for (int i = 0; i < arrays.length; i++) {
System.out.println(arrays[i]);
}
}
// 数组作为返回值
public static int[] reverseArray(int[] arrays) {
int[] result = new int[arrays.length];
// 反转操作
for (int i = 0, j = result.length - 1; i < arrays.length; i++, j--) {
result[j] = arrays[i];
}
return result;
}
}
输出结果:
1 3 4 5 6
===============================
1 3 4 5 6
===============================
6 5 4 3 1
多维数组
public class ArrayDemo05 {
public static void main(String[] args) {
int[][] arrays = {{1}, {3,2,3,5}, {4, 5, 6}};
for (int[] array : arrays) {
for (int i : array) {
System.out.print(i + " ");
}
}
}
}
冒泡排序
冒泡排序是最出名的排序算法之一,总共有八大排序。
public class ArrayDemo07 {
public static void main(String[] args) {
// 冒泡排序:比较数组中两个相邻的元素,如果第一个数比第二个数大,就交换位置。
// 每次比较都会产生出一个最大或者最小的数。
// 下一轮可以少一次排序!!
// 一次循环,直到结束!!
int[] a = {6,3,6776,434,221,2,3,};
int[] b = sort(a);
System.out.println(Arrays.toString(b));
}
public static int[] sort(int[] array){
int temp;
// 外层循环,判断要走多少次
for (int i = 0; i < array.length-1; i++) {
// 优化
boolean flag = false;
// 判断大小
for (int j = 0; j < array.length-1-i; j++) {
/*
如果判断条件为:array[j]>array[j+1],则会依次将较大的值移到后面
如果判断条件为:array[j+1]>array[j],则会依次将较小的值移到后面
*/
if(array[j]>array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = true;
}
}
if(!flag){
break;
}
}
return array;
}
}
输出结果:
[2, 3, 3, 6, 221, 434, 6776]
稀疏数组
- 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组
- 稀疏数组的处理方式是:
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
public class ArrayDemo08 {
public static void main(String[] args) {
// 创建一个二维数组 11*11 0:没有棋子 1:黑棋 2:白棋
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
System.out.println("打印数组");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
System.out.println("=========================================");
System.out.println("创建稀疏数组");
// 判断有多少个不为0的数
int sum = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
sum++;
}
}
}
System.out.println("sum:" + sum);
// 创建稀疏数组
int[][] array2 = new int[sum + 1][3];
array2[0][0] = 11; // 原数组的行数
array2[0][1] = 11; // 原数组的列数
array2[0][2] = sum;
int count = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
System.out.println("打印稀疏数组");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0] + "\t" + array2[i][1]+"\t" + array2[i][2]);
}
System.out.println("================================");
System.out.println("通过稀疏数组还原数组");
int[][] array3 = new int[array2[0][0]][array2[0][1]];
for (int i = 1; i <array2.length ; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
// 打印还原数组
for (int i = 0; i < array3.length; i++) {
for (int j = 0; j < array3[i].length; j++) {
System.out.print(array3[i][j] + "\t");
}
System.out.println();
}
}
}
打印数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
=========================================
创建稀疏数组
sum:2
打印稀疏数组
11 11 2
1 2 1
2 3 2
================================
通过稀疏数组还原数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

浙公网安备 33010602011771号